摘要:是一個(gè)高效的二進(jìn)制序列化框架它像一樣支持不同語(yǔ)言間的數(shù)據(jù)交換但是它的性能更快序列化之后的碼流更小的特點(diǎn)如下編解碼高效性能高序列化之后的碼流小支持跨語(yǔ)言編碼器和解碼器開(kāi)發(fā)編碼器開(kāi)發(fā)負(fù)責(zé)將類(lèi)型的對(duì)象編碼為數(shù)組然后添加到集合中解碼器開(kāi)發(fā)首先從數(shù)
MessagePack 是一個(gè)高效的二進(jìn)制序列化框架, 它像 JSON 一樣支持不同語(yǔ)言間的數(shù)據(jù)交換, 但是它的性能更快, 序列化之后的碼流更小.
MessagePack 的特點(diǎn)如下:
編解碼高效, 性能高.
序列化之后的碼流小.
支持跨語(yǔ)言.
MessagePack 編碼器和解碼器開(kāi)發(fā)MessagePack 編碼器開(kāi)發(fā)io.netty netty-all 5.0.0.Alpha1
public class MsgpackEncoder extends MessageToMessageEncoder
負(fù)責(zé)將 Object 類(lèi)型的 POJO 對(duì)象編碼為 byte 數(shù)組, 然后添加到集合中.
MessagePack 解碼器開(kāi)發(fā)public class MsgpackDecoder extends MessageToMessageDecoder{ @Override protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { int length = msg.readableBytes(); byte[] array = new byte[length]; msg.getBytes(msg.readerIndex(), array, 0 , length); MessagePack msgpack = new MessagePack(); out.add(msgpack.read(array)); } }
首先從數(shù)據(jù)報(bào) msg 中獲取需要解碼的 byte 數(shù)組, 然后調(diào)用 MessagePack 的 read 方法將其反序列化為 Objcet 對(duì)象, 將解碼后的對(duì)象加入到 List 集合中. 這樣就完成了 MessagePack 的解碼操作.
粘包/半包支持ch.pipeline().addLast("frameDecoder", new LengthFieldBasedFrameDecoder(65535, 0, 2, 0, 2)); ch.pipeline().addLast("msgpack decoder", new MsgpackDecoder()); ch.pipeline().addLast("frameEncoder", new LengthFieldPrepender(2)); ch.pipeline().addLast("msgpack encoder", new MsgpackEncoder());
利用 LengthFieldBasedFrameDecoder 和 LengthFieldPrepender, 結(jié)合新開(kāi)發(fā)的 MessagePack 編解碼框架, 實(shí)現(xiàn)對(duì) TCP 粘包/半包支持.
在 MessagePack 編碼器之前增加 LengthFieldPrepender, 它將在 ByteBuf 之前增加 2 個(gè)字節(jié)的消息長(zhǎng)度字段.
+----------------+ +--------+----------------+ | "HELLO, WORLD" |--->+ 0x000C | "HELLO, WORLD" | +----------------+ +--------+----------------+
在 MessagePack 解碼器之前增加 LengthFieldBasedFrameDecoder, 用于處理半包消息, 這樣后面的 MsgpackDecoder 接收到的永遠(yuǎn)是整包消息.
+--------+----------------+ +----------------+ + 0x000C | "HELLO, WORLD" |--->| "HELLO, WORLD" | +--------+----------------+ +----------------+
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/72785.html
摘要:背景現(xiàn)在寫(xiě)客戶端或者網(wǎng)頁(yè)的時(shí)候越來(lái)越多的需要與長(zhǎng)連接打交道尤其是在這個(gè)老板動(dòng)不動(dòng)就要搞一個(gè)聊天系統(tǒng)的時(shí)代后端大哥們于是分分鐘就能造一個(gè)基于或者的消息協(xié)議出來(lái)但是問(wèn)題在于每做一個(gè)新項(xiàng)目后端大哥們就能造出一個(gè)新協(xié)議而且能有各種神奇的限制比如說(shuō)要 背景 現(xiàn)在寫(xiě)客戶端或者網(wǎng)頁(yè)的時(shí)候, 越來(lái)越多的需要與長(zhǎng)連接打交道, 尤其是在這個(gè)老板動(dòng)不動(dòng)就要搞一個(gè)聊天系統(tǒng)的時(shí)代, 后端大哥們于是分分鐘就能造一...
摘要:筆者在編碼詳解與中編碼實(shí)踐一文中介紹了中編碼相關(guān)的基礎(chǔ)知識(shí),其中沒(méi)有介紹純粹的編解碼方案,筆者后來(lái)根據(jù)網(wǎng)上的代碼完善了下這個(gè)庫(kù),并且對(duì)中三種不同的編解碼方案進(jìn)行了比較。 Isomorphic Urlencode Here is English Version For README 筆者在URL編碼詳解與DOM中GBK編碼實(shí)踐一文中介紹了JavaScript中URL編碼相關(guān)的基礎(chǔ)知識(shí),其...
摘要:本文仍以該實(shí)例為例,探討該自定義通信協(xié)議的具體工作流程,以及如何以注冊(cè)的形式靈活插拔通信消息對(duì)象。進(jìn)行二進(jìn)制數(shù)據(jù)幀的解碼操作時(shí),數(shù)據(jù)幀中已包含了消息的功能位,據(jù)此可獲取相應(yīng)的編解碼器,而后可以對(duì)該數(shù)據(jù)幀進(jìn)行解析,生成相應(yīng)的消息對(duì)象。 本文為該系列的第三篇文章,設(shè)計(jì)需求為:服務(wù)端程序和眾多客戶端程序通過(guò) TCP 協(xié)議進(jìn)行通信,通信雙方需通信的消息種類(lèi)眾多。上一篇文章以一個(gè)具體的需求為例,...
閱讀 1408·2023-04-25 23:22
閱讀 1799·2023-04-25 20:04
閱讀 2739·2021-11-22 15:24
閱讀 2895·2021-11-11 16:54
閱讀 2030·2019-08-30 14:03
閱讀 1571·2019-08-29 16:35
閱讀 1774·2019-08-26 10:29
閱讀 2859·2019-08-23 18:01