VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#教程之.net 平台下, Socket通讯协议中间件设计思(2)

  

复制代码
public class NetValueString: NetValueBase
    {
        public string Value { get; set; } = string.Empty;
        public override object GetValue()
        {
            return Value;
        }

        public NetValueString()
        {
            ValueType = EN_DataType.en_string;
        }

        public NetValueString(string value)
        {
            ValueType = EN_DataType.en_string;
            Value = value;
        }
    }
复制代码
NetValueString值最终要以字节流方式传送出去,采用如下方式序列化:
string值采用utf8传输,先将字符串转换成字节流;分别写入字节流的长度,实际的字节流;
在序列化中,没用多余字段。比.net 自带的序列化类处理要高效的多,大家可以对比下。
1
2
3
4
5
6
7
internal static void WriteStringValue(Stream stream, string value)
       {
           byte[] bytes = Encoding.UTF8.GetBytes(value);
 
           WriteInt32(stream, bytes.Length);
           stream.Write(bytes, 0, bytes.Length);
       }

其它类型的序列化,与此类似,不在累述。反序列化如何操作,也不难想像。

传输

序列化后的数据要发送出去,需要下一层来处理。

这层的主要功能就是分包和合包。(数据很小的时候就不需要分包了)

1
2
3
4
5
6
7
8
public class RawNetPacket
    {
        public static int HeadLen = 14;
        public UInt16 PacketLen;
        public UInt32 PacketId;   //一个完整的包 唯一id
        public UInt32 TotalNO;    //共有多少个包
        public UInt32 PacketNO;   //包序列号
        public byte[] Body;     //承载NetPacket序列化的数据,有可能分包发送
1
}  

 具体如何分包和合包,可以参考附件源码。

使用举例

1 传送文件

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private NetPacket GetPacketByFile(string fileName)
       {
           using (FileStream stream = new FileInfo(fileName).OpenRead())
           {
               NetPacket result = new NetPacket();
               result.PacketType = 2;
               result.Param1 = 2;
               result.Param2 = 3;
               result.Items = new List<NetValuePair>();
 
               //string
               NetValuePair pair = new NetValuePair();
               pair.Key = "文件名称";
               pair.Value = new NetValueString(fileName);
               result.Items.Add(pair);
 
               //byte
               pair = new NetValuePair();
               pair.Key = "文件二进制数据";
               NetValueListByte fileBuffer = new NetValueListByte();
               fileBuffer.Value = new byte[stream.Length];
               stream.Read(fileBuffer.Value, 0, Convert.ToInt32(stream.Length));
 
               pair.Value = fileBuffer;
               result.Items.Add(pair);
               return result;
           }
       }

相关教程