サーバdatalenを+メッセージ-----> PackageData ------>ネットワーク伝送([]バイト)----->クライアント----> UnPackageData ----> datalenを+メッセージ
ネットワークは、独自のカスタムプロトコルを必要とするためSoketでプログラムを書きます。
{レン+データ} LENは、データを解析されたデータの長さ、データが解析されたデータを転送します
サーバー上のメッセージ
クライアントメッセージ
サービスのJSONタグの端をという名前のクライアントのニーズやメッセージフィールドが維持されていることに注意してください。そうしないと、サーバは(このバグは、私は夜プラス朝を発見した)JSON欠落しているフィールドを解析します
使用してシステムを。 使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。 使用してSystem.Textのを。 使用してSystem.Threading.Tasksを。 使用してNewtonsoft.Jsonを。 [直列化] パブリック クラスメッセージ { パブリック 文字列execute_type。 公共の 文字列struct_name。 公共の 文字列データを、 } クラスutilの { /// <要約> /// 包装数据 /// </要約> /// <PARAM NAME = "データ"> </ PARAM> /// <PARAM NAME = "exeCuteType"> </ PARAM> /// <PARAM NAME = "クラス名"> </ PARAM> パブリック 静的 バイト [] PackageData(オブジェクトデータ、文字列 exeCuteType、ストリングクラス名) { ストリング jsonData = JsonConvert.SerializeObject (データ); // バイト[] byteData = Encoding.UTF8.GetBytes(jsonStr)。 メッセージメッセージ= 新しいメッセージ()。 message.struct_name = クラス名。 message.data = jsonData。 message.execute_type = exeCuteType。 バイト[] byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(メッセージ))。 INT32 LEN = byteData.Length。 バイト [] lenData = BitConverter.GetBytes(LEN)。 バイト [] finalData = 新しい バイト [lenData.Length + byteData.Length]。 lenData.CopyTo(finalData、0 ); byteData.CopyTo(finalData、4 )。 返すfinalDataを。 } /// <要約> /// 拆分数据 /// </要約> /// <PARAM NAME = "データ"> </ PARAM> /// <リターン> </戻り> パブリック 静的メッセージUnPackageData(バイト[]データ) { のInt32 LEN = BitConverter.ToInt32(データ、0 ); System.Console.WriteLine(LEN)。 バイト [] strByte = 新しい バイト[LEN]。 Array.Copy(データ、4、strByte、0 、LEN)。 メッセージmessage = JsonConvert.DeserializeObject <メッセージ> (Encoding.UTF8.GetString(strByte))。 リターン・メッセージ。 } }
// 没有??行く // 包装数据 FUNC PackageData(データインターフェース {}、executeType列、structType列)[] バイト{ dataByte、ERR: = json.Marshal(およびデータ) 場合!ERR = ゼロ{ config.Logger。 Fatalln( "解析出错" 、ERR) } strJson: = 文字列(dataByte) MSG: = メッセージ{} msg.ExecuteType = executeType msg.Data = strJson msg.StructName = structType finalData、ERR: = json.Marshal(&MSG) 場合!=誤るゼロ{ log.Fatalln( "解析失败" 、ERR) } VARのlenByteを =作る([] バイト、4 ) 長さ: = UINT32(LEN(finalData)) binary.LittleEndian.PutUint32(lenByte、長さ) ALLDATA : = [] [] バイト{lenByte、finalData} あるnewData: = bytes.Join(ALLDATA、[] バイト( "" )) を返すあるnewData } // 解析数据 FUNC UnPackageData(データ[] バイト)(メッセージ、エラー){ // のprintln( "总长度=:"、LEN(データ)) MES:=メッセージ{} // UTF8。 ByteBuffer:= bytes.NewBuffer(データ[0:4 ]) VAR DATALEN INT32 ERR: = binary.Read(ByteBufferの、binary.LittleEndian、&DATALEN)// binary.BigEndian.Uint32(データ[:4]) の場合、ERR =!ゼロ{ config.Logger.Println(ERR) } ERR = json.Unmarshal(データ[4:4 + DATALEN]、&MES) なら!ERR = ゼロ{ fmt.Println( "解析失败" 、ERR) } 戻りMES、 ERR }