建立TCP服务端

打印 上一主题 下一主题

主题 823|帖子 823|积分 2469

利用Socket建立TCP服务端。
项目要求:建立一个TCP服务端,接收机器人发送过来的实时数据。机器人会一直尝试连接一个IP地址端口号,连接上之后就会将数据报文发送过来。服务端要根据报文格式对数据进行解析。当发送过来的数据报文不符合格式的时候,断开Socket连接。
主要代码:
  1.         public Robot_Method(Robot_Device _Device)
  2.         {
  3.             Device = _Device;
  4.         }
  5.         private Robot_Device Device;//设备实体类
  6.         private Socket Socket = null;//服务端Socket。
  7.         private Socket ClientSocket = null;//客户端Socket
  8.         Thread th;//接收数据线程
  9.         //接收数据事件
  10.         public Action<string> recvMessageEvent = null;
  11.       
  12.         public void Connect()
  13.         {
  14.             Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  15.             IPAddress Localhost = IPAddress.Any;
  16.             int LocalPort = Device.Device_Port;
  17.             IPEndPoint endPoint = new IPEndPoint(Localhost, LocalPort);//服务端需要开启的网络终结点。客户端链接这个IP地址和端口号。
  18.             Socket.Bind(endPoint);//绑定网络终结点
  19.             Socket.Listen(1);
  20.             Thread th = new Thread(ListenClientConnect);//开启线程来等待客户端连接。
  21.             th.IsBackground = true;
  22.             th.Start();
  23.         }
  24.         public void DisConnect()
  25.         {
  26.             Socket.Close();//关闭服务端
  27.         }
  28.         public void ListenClientConnect()
  29.         {
  30.             while (true)
  31.             {
  32.                 ClientSocket = Socket.Accept();//等待客户端连接。
  33.                 th?.Abort();//如果接收数据线程不为空,则终止它。
  34.                 th = new Thread(ReceiveMessage);//开启接收数据线程。
  35.                 th.IsBackground = true;
  36.                 th.Start();
  37.             }
  38.         }
  39.         public void ReceiveMessage()
  40.         {
  41.             while (true)
  42.             {
  43.                 string ErrorMessage = "";
  44.                 try
  45.                 {
  46.                     byte[] vs = new byte[1024];
  47.                     int lenght = ClientSocket.Receive(vs);
  48.                     if (lenght == 177)
  49.                     {
  50.                         if (vs[0] != 0xFE && vs[1] != 0x5A && vs[2] != 0xA5)
  51.                         {
  52.                             ErrorMessage = "报文头错误";
  53.                             recvMessageEvent?.Invoke(ErrorMessage);
  54.                             ClientSocket.Close();
  55.                             break;
  56.                         }
  57.                         else
  58.                         {
  59.                             Device.Device_State = true;
  60.                             GetResult(vs);//处理接收的报文数据
  61.                             ErrorMessage = "";//当ErrorMessage为""时,表示接收数据报文成功,且解析成功。通过事件通知数据已经处理完成。
  62.                             recvMessageEvent?.Invoke(ErrorMessage);
  63.                         }
  64.                     }
  65.                     else
  66.                     {
  67.                         Device.Device_State = false;
  68.                         ErrorMessage = "收到的长度不是规定的报文长度:177";
  69.                         recvMessageEvent?.Invoke(ErrorMessage);
  70.                         ClientSocket.Close();
  71.                         break;
  72.                     }
  73.                 }
  74.                 catch (Exception ex)
  75.                 {
  76.                     Device.Device_State = false;
  77.                     ErrorMessage = ex.Message;
  78.                     recvMessageEvent?.Invoke(ErrorMessage);
  79.                     ClientSocket.Close();
  80.                     break;
  81.                 }
  82.             }
  83.         }
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表