トランスポートストリームの形態で伝送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}
結果は、上記の方法は、解決策がで出て行くことができるということです