using System; using System.Net; using System.Net.Sockets; using System.Threading.Tasks; namespace HDL_ON.DriverLayer { public class Control_TcpClient { //声明IP,端口,和一个用来连接的Socket public string _ip; private TcpClient _tcpClient; //创建一个委托,用来满足其他类调用 //public delegate void DelegateMessage(string str); public Action ReceiveEvent; /// /// 构造函数 /// public Control_TcpClient(string serverIp) { _ip = serverIp; } //TCP连接 public bool Connect(int _port = 8586) { if (string.IsNullOrEmpty(_ip) || _port == 0) { return false; } _tcpClient = new TcpClient(); try { _tcpClient.Connect(IPAddress.Parse(_ip), _port); Task.Run(new Action(ReceiveMessage));//开启线程,不停接收消息 MainPage.Log($"打开tcp client{_ip}:{_port}"); } catch (Exception e) { MainPage.Log(e.Message); throw; } return true;//返回连接状态 } /// /// 关闭连接 /// /// public bool Close() { if (_tcpClient == null) return true; _tcpClient.Close(); _tcpClient = null; return true; } /// /// 发送消息 /// /// 需要发送的字节 public void SendMessage(byte[] bytes) { NetworkStream networkStream = _tcpClient.GetStream(); if (networkStream.CanWrite) { networkStream.Write(bytes, 0, bytes.Length); } //networkStream.Close(); } /// /// 获取列表数据回调方法 /// public Action GetListResponseAction; //接收消息 public void ReceiveMessage() { NetworkStream networkStream = _tcpClient.GetStream(); while (true) { // 定义一个2M的缓存区; byte[] arrMsgRec = new byte[1024 * 1024 * 2]; int size = networkStream.Read(arrMsgRec, 0, arrMsgRec.Length); var tcpDataString = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, arrMsgRec.Length); if (!string.IsNullOrEmpty(tcpDataString)) { ReceiveEvent?.Invoke(tcpDataString); } //// 将接受到的数据存入到输入 arrMsgRec中; //int length = -1; //try //{ // length = socketClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度; //} //catch (Exception ex) //{ // MainPage.Log($"tcpListener error 1 : {ex.Message}"); // Flag_Receive = false; // // 从通信线程集合中删除被中断连接的通信线程对象; // string keystr = socketClient.RemoteEndPoint.ToString(); // dic_ClientSocket.Remove(keystr);//删除客户端字典中该socket // dic_ClientThread[keystr].Abort();//关闭线程 // dic_ClientThread.Remove(keystr);//删除字典中该线程 // tcpClient = null; // socketClient = null; // break; //} //byte[] buf = new byte[length]; //Array.Copy(arrMsgRec, buf, length); //lock (tcpClient.m_Buffer) //{ // var tcpDataString = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, length); // if (!string.IsNullOrEmpty(tcpDataString)) // { // ReceiveEvent?.Invoke(tcpDataString); // } // MainPage.Log($"接收服务端数据:{tcpDataString}"); //} } } } }