服务器 datalen+Message----->PackageData------>网络传输([]byte)----->客户端---->UnPackageData---->datalen+Message
用Soket写网络程序,需要自己定制协议。
{len+data} len 解析出来的是data数据的长度,data 解析出来的是想要传输的数据
服务器上的Message
客户端的Message
需要注意的是客户端Message的字段命名需要和服务端的Json标签保持一直。否则服务端解析Json会丢失字段(这个BUG我找了一个晚上加一个早上)
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}总结
以上是内存溢出为你收集整理的golang做服务器,C#(unity)作为客户端,Socket通信问题全部内容,希望文章能够帮你解决golang做服务器,C#(unity)作为客户端,Socket通信问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)