利用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; } } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504573.html
標籤:.NET技术
