使用SuperSocket的FixedHeaderReceiveFilter进行通信

前几个月有个项目需要和其他设备通信,需要用到TCP和UDP通信.本来开始也是用的C#原生态socket通信库,但是后来发现了一个”我不想说他名字坑爹库”,经过测试,用起来还挺顺手,就直接把这个”我不想说他名字坑爹库”引入了项目中.还把使用方法写在了博客园,测试demo还上传了代码(通讯库并没有源码,只有dll文件).结果,大约三个月后,有人给我留言,说他下载了”我不想说他名字坑爹库”的demo源码...

使用SuperSocket的FixedHeaderReceiveFilter进行通信

前几个月有个项目需要和其他设备通信,需要用到TCP和UDP通信.本来开始也是用的C#原生态socket通信库,但是后来发现了一个”我不想说他名字坑爹库”,经过测试,用起来还挺顺手,就直接把这个”我不想说他名字坑爹库”引入了项目中.还把使用方法写在了博客园,测试demo还上传了代码(通讯库并没有源码,只有dll文件).

结果,大约三个月后,有人给我留言,说他下载了”我不想说他名字坑爹库”的demo源码,并且引入了项目中,但是要收费,已经过期,他们的项目已经挂了.开始我还不信((当时我在出差,其实我自己项目中的这个坑爹库也过期了),一直以为”我不想说他名字坑爹库”是免费的,是他们项目中的其他库出问题了,后来发现,这个库确实要收费的,并且还价格不菲.我简直*****了.

幸好我们的项目还没上线,不然真的要死翘翘了,丢人要丢到外国去了.不过下载我源码的兄弟就真的对不起了.我在这里真诚的为你们感到sorry.

后来嘛,就只能换噻,好在代码框架还行,通信和业务耦合度很低,换通信框架很容易.在这个开源大行其道的世界,遇到收费的库,我也是无语.再后来,就找到SuperSocket了,开源的,老板再也不担心软件过期了.

这个文章就不介绍SuperSocket的其他东西了,只写FixedHeaderReceiveFilter通信例子.

需求:一个tcp服务端,多个tcp客户端,客户端可向服务端发送消息,服务端向连接的每个客户端广播消息.

1.定义消息格式

要发送的消息格式直接给出来:

 1 Public class SuperSocketMessage 2  { 3public byte[] Start;//4个字节 4public ushort Type;//2个字节, 1表示文字消息,2表示图片消息,其他表示未知,不能解析 5public int Len;//4个字节 6public string Message;//文本信息 7public byte[] Tail;//消息结尾 8  9public SuperSocketMessage()10   {11 Start = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF };12 Tail = new byte[] { 0x1F, 0x1F, 0x1F, 0x1F };13   }14 15public byte[] ToBytes()16   {17 List<byte> list = new List<byte>();18 list.AddRange(Start);19 var t = BitConverter.GetBytes(Type);20 list.AddRange(t);21 22 var t3 = System.Text.Encoding.UTF8.GetBytes(Message);23 var t2 = BitConverter.GetBytes(t3.Length);//注意,这里不是Message.Length,而是Message转化成字节数组后的Lenght24 25 list.AddRange(t2);26 list.AddRange(t3);27 28 return list.ToArray();29   }30 }
View Code

请记住以下几个数字或信息:

  1. 消息头部包含三个元素:开始,类型和消息body的长度
  2. 从第六个字节开始表示长度
  3. 表示长度字节数是4个字节
  4. Body的长度不要搞混,不是Message的字符串长度,而是Message转换字节数组后的长度,调试的时候,开始用了Message的字符串长度,给我造成了几个小时的浪费.
  5. 以上信息请和下面的MyReceiveFilter类中的参数对照看.

2.建立一个tcp客户端

1.新建一个控制台程序TcpClientTest,这里为了测试的客观性,直接使用C#的TcpClient作为客户端.

2.添加Class: MyTcpClient.cs

 1 class MyTcpClient 2  { 3private System.Net.Sockets.TcpClient tcpClient; 4public MyTcpClient(string ip, int port) 5   { 6  7 tcpClient = new System.Net.Sockets.TcpClient(ip, port); 8 byte[] recData = new byte[1024]; 9 Action a = new Action(() =>10 {11  while (true)12  {13   tcpClient.Client.Receive(recData);14var msg = System.Text.Encoding.UTF8.GetString(recData);15   Console.WriteLine(msg);16  }17 });18 a.BeginInvoke(null, null);19 20   }21 22public void Send(string message)23   {24 var data = System.Text.Encoding.UTF8.GetBytes(message);25 tcpClient.Client.Send(data);26   }27public void Send(byte[] message)28   {29 tcpClient.Client.Send(message);30   }31 }
View Code

3.Main函数:

 1 static void Main(string[] args) 2   { 3 MyTcpClient c = new MyTcpClient("127.0.0.1", 2020); 4 SuperSocketMessage.SSMessage msg = new SuperSocketMessage.SSMessage(); 5 while (true) 6 { 7  string m = Console.ReadL
源文地址:https://www.guoxiongfei.cn/cntech/19229.html