利用Socket建立TCP服務端。 項目要求:建立一個TCP服務端,接收機器人發送過來的實時數據。機器人會一直嘗試連接一個IP地址埠號,連接上之後就會將數據報文發送過來。服務端要根據報文格式對數據進行解析。當發送過來的數據報文不符合格式的時候,斷開Socket連接。 主要代碼: public Ro ...
利用Socket建立TCP服務端。
項目要求:建立一個TCP服務端,接收機器人發送過來的實時數據。機器人會一直嘗試連接一個IP地址埠號,連接上之後就會將數據報文發送過來。服務端要根據報文格式對數據進行解析。當發送過來的數據報文不符合格式的時候,斷開Socket連接。
主要代碼:
public Robot_Method(Robot_Device _Device) { Device = _Device; } private Robot_Device Device;//設備實體類 private Socket Socket = null;//服務端Socket。 private Socket ClientSocket = null;//客戶端Socket Thread th;//接收數據線程 //接收數據事件 public Action<string> recvMessageEvent = null; public void Connect() { Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress Localhost = IPAddress.Any; int LocalPort = Device.Device_Port; IPEndPoint endPoint = new IPEndPoint(Localhost, LocalPort);//服務端需要開啟的網路終結點。客戶端鏈接這個IP地址和埠號。 Socket.Bind(endPoint);//綁定網路終結點 Socket.Listen(1); Thread th = new Thread(ListenClientConnect);//開啟線程來等待客戶端連接。 th.IsBackground = true; th.Start(); } public void DisConnect() { Socket.Close();//關閉服務端 } public void ListenClientConnect() { while (true) { ClientSocket = Socket.Accept();//等待客戶端連接。 th?.Abort();//如果接收數據線程不為空,則終止它。 th = new Thread(ReceiveMessage);//開啟接收數據線程。 th.IsBackground = true; th.Start(); } } public void ReceiveMessage() { while (true) { string ErrorMessage = ""; try { byte[] vs = new byte[1024]; int lenght = ClientSocket.Receive(vs); if (lenght == 177) { if (vs[0] != 0xFE && vs[1] != 0x5A && vs[2] != 0xA5) { ErrorMessage = "報文頭錯誤"; recvMessageEvent?.Invoke(ErrorMessage); ClientSocket.Close(); break; } else { Device.Device_State = true; GetResult(vs);//處理接收的報文數據 ErrorMessage = "";//當ErrorMessage為""時,表示接收數據報文成功,且解析成功。通過事件通知數據已經處理完成。 recvMessageEvent?.Invoke(ErrorMessage); } } else { Device.Device_State = false; ErrorMessage = "收到的長度不是規定的報文長度:177"; recvMessageEvent?.Invoke(ErrorMessage); ClientSocket.Close(); break; } } catch (Exception ex) { Device.Device_State = false; ErrorMessage = ex.Message; recvMessageEvent?.Invoke(ErrorMessage); ClientSocket.Close(); break; } } }