[移動]スティック包装と開梱の問題は、TCP軽量サーバーフレームワークをパケット

トランスポートストリームの形態で伝送TCPデータは、そう彼のメッセージの終了とみなされるべきかを決定する方法がないので、問題スティックパッケージが存在することになる、複数のパッケージが一緒に接着され

そのような形態は、カスタムを解決するために使用することができ、メッセージは、ヘッド+ボディヘッドがデータ・タイプの長さとデータ数、長さ及び数を含む、に分割されるUINT32即ち32は4つのバイトを占有している、8つのワードヘッドの合計が占めます祭り

データエンティティとしてメッセージパッケージ構造、例えば以下のように3つの番号、データ長属性

パッケージZNETの

タイプのメッセージ構造体{ 
    IdをUINT32 
    データ[] バイト
    さmsglen UINT32 
} 

FUNC NewMessage() * メッセージ{ 
    M: =&メッセージ{} 
    戻りM 
} 
FUNC(M * メッセージ)のgetId()UINT32 { 
    戻りm.Id 
} 
FUNC( M *メッセージ)のGetData()] バイト{ 
    戻りm.Data 
} 
FUNC(M * メッセージ)GetMsgLen(){UINT32 
    リターンm.MsgLen 
} 
FUNC(M *メッセージ)SETID(識別UINT32){ 
    m.Id =ID 
} 
FUNC(M *メッセージ)SetDataメソッド(データ[] バイト){ 
    m.Data = データ
} 
FUNC(M * メッセージ)SetMsgLen(LEN UINT32){ 
    m.MsgLen = LEN 
}

パッケージ構造をアンパックパケット、パケットをアンパック含む方法は、パケット長は、書き込みに、書き込みシリアル番号、書き込みトランザクションれ、アンパックだけ長さと数を取得し、その後、次のデータを取ります

パッケージZNETの

インポート" zinx / zinterface " 

インポート" バイト" 

輸入" コード/バイナリ" 

型DataPack構造体{ 
} 

NewDataPack()FUNC * DataPack { 
    DP: =&DataPack {} 
    戻りDP 
} 
FUNC(DP * DataPack)パック(Mのzinterface .IMessage)([] バイト、エラー){ 
    dataBuff: = bytes.NewBuffer([] バイト{})
    binary.Write(dataBuff、binary.LittleEndian、m.GetMsgLen())
    binary.Write(dataBuff、binary.LittleEndian、 m.GetId())
    binary.Write(dataBuff、binary.LittleEndian、m.GetData())
    戻りdataBuff.Bytes()、ゼロ
} 
FUNC(DP * DataPack)アンパック(D [] バイト)(zinterface.IMessage、エラー){ 
    M: = NewMessage()
    R: = bytes.NewReader(D)
    binary.Read(R 、binary.LittleEndian、 m.MsgLen)
    binary.Read(R、binary.LittleEndian、 m.Id)
    リターンM、ゼロ
}

テスト、最初のパケットと、次にアンパック

    本体:= [] バイト" nihao " 
    M: = znet.NewMessage()
    m.SetId(888 
    m.SetData(本体)
    m.SetMsgLen(UINT32(LEN(本体)))
    log.Println(M)

    、DP : = znet.NewDataPack()
    dataPack、_: = dp.Pack(M)
    log.Println(dataPack)

    M2、_: = dp.Unpack(dataPack)
    log.Println(M2)

2019年12月17日午前15時42分30秒&{888 [110 105 104 97 111] 5}
2019年12月17日午前15時42分30秒[5 0 0 3 0 0 120 110 105 104 97 111]
12分の2019 / 17夜03時42分30秒&{888 [] 5}

結果は、上記の方法は、解決策がで出て行くことができるということです

 

おすすめ

転載: www.cnblogs.com/taoshihan/p/12057619.html