Socket通讯协议

来源:互联网 发布:java工程师转行 编辑:程序博客网 时间:2024/05/05 14:15

通讯协议的用途

在Socket强联网中,我们可以通过定义一些对数据封装的规则来进行数据的传输,让数据可以在服务器和客户端进行相互传输

自定义通讯协议的好处

在网络中可以使用把数据转换为Json字符串然后进行服务器和客户端的通讯,但是使用Json传输数据有一些缺点,第一就是Json不支持float类型的数据,第二就是数据转换为Json后会产生一些我们不需要的数据,这样会产生不必要的数据产生,所有我们使用自定义的通讯协议可以减少不必要的数据产生,减轻通讯的负担,性能会比使用Json好.

自定义通讯协议的规则

每条数据都有一个协议编号,在数据传输的时候也一并传输过去,让接受方可以知道传输的是哪个协议,可以使用对应的协议来接受,所以定义一个接口,协议必须实现这个接口
public interface IProto{    //协议编号    ushort ProtoCode { get; }}   

测试协议

注:数据流的类
http://blog.csdn.net/qq_37551067/article/details/78229881

/// <summary>/// 测试协议/// </summary>public struct TestProto : IProto{    //编号    public ushort ProtoCode { get { return 1004; } }    //测试属性    public int Id;    public string Name;    public int Type;    public float Price;    //把数据转换为Byte数组    public byte[] ToArray()    {        //在发送通讯协议时先获取协议的实例        //给属性附上需要的数据        //调用ToArray把数据写入数据流中在转换为数组        using (MMO_MemoryStream ms = new MMO_MemoryStream())        {            ms.WriteUShort(ProtoCode);            ms.WriteInt(Id);            ms.WriteUTF8String(Name);            ms.WriteInt(Type);            ms.WriteFloat(Price);            return ms.ToArray();        }    }    //解析数据    public static TestProto GetProto(byte[] buffer)    {        //协议编号是ushort类型,占两个字节        //在Socket通讯中解析数据获取协议编号        //用对应的协议类的静态方法解压数据        //把buffer数据写入流中        //按照写入的顺序对应读取        TestProto proto = new TestProto();        using (MMO_MemoryStream ms = new MMO_MemoryStream(buffer))        {            proto.Id = ms.ReadInt();            proto.Name = ms.ReadUTF8String();            proto.Type = ms.ReadInt();            proto.Price = ms.ReadFloat();        }        return proto;    }}
原创粉丝点击