服務器 datalen+Message----->PackageData------>網絡傳輸([]byte)----->客戶端---->UnPackageData---->datalen+Messagejson
用Soket寫網絡程序,須要本身定製協議。服務器
{len+data} len 解析出來的是data數據的長度,data 解析出來的是想要傳輸的數據網絡
服務器上的Messageui
客戶端的Messagespa
須要注意的是客戶端Message的字段命名須要和服務端的json標籤保持一直。不然服務端解析json會丟失字段(這個bug我找了一個晚上加一個早上)code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; [Serializable] public class Message { public string execute_type; public string struct_name; public string data; } class util { /// <summary> /// 包裝數據 /// </summary> /// <param name="data"></param> /// <param name="exeCuteType"></param> /// <param name="className"></param> public static byte[] PackageData(object data,string exeCuteType,string className) { string jsonData = JsonConvert.SerializeObject(data); //byte[] byteData = Encoding.UTF8.GetBytes(jsonStr); Message message = new Message(); message.struct_name = className; message.data = jsonData; message.execute_type = exeCuteType; byte[] byteData =Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)); Int32 len = byteData.Length; byte[] lenData = BitConverter.GetBytes(len); byte[] finalData = new byte[lenData.Length + byteData.Length]; lenData.CopyTo(finalData, 0); byteData.CopyTo(finalData, 4); return finalData; } /// <summary> /// 拆分數據 /// </summary> /// <param name="data"></param> /// <returns></returns> public static Message UnPackageData(byte[] data) { Int32 len = BitConverter.ToInt32(data, 0); System.Console.WriteLine(len); byte[] strByte = new byte[len]; Array.Copy(data,4,strByte,0,len); Message message = JsonConvert.DeserializeObject<Message>(Encoding.UTF8.GetString(strByte)); return message; } }
//沒有go?? //包裝數據 func PackageData(data interface{},executeType string,structType string)[]byte{ dataByte,err:=json.Marshal(&data) if err!=nil{ config.Logger.Fatalln("解析出錯",err) } strJson:=string(dataByte) msg:=Message{} msg.ExecuteType=executeType msg.Data=strJson msg.StructName=structType finalData,err:=json.Marshal(&msg) if err!=nil{ log.Fatalln("解析失敗",err) } var lenByte =make([]byte,4) length:=uint32(len(finalData)) binary.LittleEndian.PutUint32(lenByte,length) allData:=[][]byte{lenByte,finalData} newData:=bytes.Join(allData,[]byte("")) return newData } //解析數據 func UnPackageData(data []byte)(Message, error){ //println("總長度=:",len(data)) mes:=Message{} //utf8. byteBuffer:=bytes.NewBuffer(data[0:4]) var dataLen int32 err:=binary.Read(byteBuffer,binary.LittleEndian,&dataLen)//binary.BigEndian.Uint32(data[:4]) if err!=nil{ config.Logger.Println(err) } err=json.Unmarshal(data[4:4+dataLen],&mes) if err!=nil{ fmt.Println("解析失敗",err) } return mes,err }