golang做服务器,C#(unity)作为客户端,Socket通信问题

golang做服务器,C#(unity)作为客户端,Socket通信问题,第1张

概述服务器 datalen+Message----->PackageData------>网络传输([]byte)----->客户端---->UnPackageData---->datalen+Message 用Soket写网络程序,需要自己定制协议。 {len+data}    len 解析出来的是data数据的长度,data 解析出来的是想要传输的数据  服务器上的Message 客户端的Mess

服务器 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通信问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1266981.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存