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

服务器 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
}

 

转载于:https://www.cnblogs.com/Jokerlearn/p/10929818.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Golang 直播服务器是使用 Go 语言开发的直播服务端软件。Go 语言是一种开源的高性能编程语言,特点是简洁、高效、易用,并具备并发编程的能力。因此,使用 Go 开发直播服务器能够满足直播行业对于性能和并发处理的需求。 Golang 直播服务器主要具备以下功能: 1. RTMP 协议支持:Golang 直播服务器可以接收和处理来自用户端的 RTMP 视频流,实现音视频编码、解码、转码等功能。 2. 实时转发:Golang 直播服务器可以将接收到的视频流实时转发给观众端,实现实时的直播效果。 3. 弹幕支持:弹幕是直播观众与主播之间的实时互动形式,Golang 直播服务器可以支持弹幕的发送和接收,并实时显示在观众端的播放画面上。 4. 直播录制:Golang 直播服务器可以将直播过程进行录制,并保存为视频文件,方便用户进行回放或存档。 5. 观众管理:Golang 直播服务器可以管理观众的连接和状态,实时统计观众数等信息。 6. 异常处理:Golang 直播服务器能够处理各种异常情况,包括网络断、视频流异常等,并提供相应的异常处理策略,确保直播过程的稳定性和可靠性。 总之,Golang 直播服务器以其高性能、高并发处理能力和丰富的功能,为直播行业提供了一种稳定可靠的直播服务端解决方案。通过使用 Go 语言开发的直播服务器,可以实现高质量、高可靠性的直播体验,满足用户的直播需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值