亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

MessagePack 編解碼

xuxueli / 3107人閱讀

摘要:是一個(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ā)

    io.netty
    netty-all
    5.0.0.Alpha1
MessagePack 編碼器開(kāi)發(fā)
public class MsgpackEncoder extends MessageToMessageEncoder {
    @Override
    protected void encode(ChannelHandlerContext ctx, Object msg, List out) throws Exception {
        MessagePack msgpack = new MessagePack();
        byte[] bytes = msgpack.write(msg);
        out.add(bytes);
    }
}

負(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)用 MessagePackread 方法將其反序列化為 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());

利用 LengthFieldBasedFrameDecoderLengthFieldPrepender, 結(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

相關(guān)文章

  • 造輪子系列(二): 史上最簡(jiǎn)單的長(zhǎng)連接通信協(xié)議及實(shí)現(xiàn)

    摘要:背景現(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í)代, 后端大哥們于是分分鐘就能造一...

    Alliot 評(píng)論0 收藏0
  • JavaScript中三種GBK/GB2312解碼方案對(duì)比

    摘要:筆者在編碼詳解與中編碼實(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í),其...

    BlackFlagBin 評(píng)論0 收藏0
  • 基于 Netty 的可插拔業(yè)務(wù)通信協(xié)議的實(shí)現(xiàn)「3」業(yè)務(wù)注冊(cè)及實(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è)具體的需求為例,...

    LdhAndroid 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<