Server datalen + Message -----> PackageData ------> network transmission ([] byte) -----> Client ----> UnPackageData ----> datalen + Message
With Soket write programs for the network needs its own custom protocols.
{Len + data} len is the length of data parsed data, data is parsed want to transfer data
Message on the server
Client Message
Note that the client needs and Message fields named json tag end of the service has been maintained. Otherwise, the server will parse json missing field (this bug I found a night plus a morning)
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 }