golang作服務器,C#(unity)做爲客戶端,Socket通訊問題

服務器 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 }
相關文章
相關標籤/搜索