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