From d6578b10542226650e263815dea75e598a7090f9 Mon Sep 17 00:00:00 2001 From: wxr <464027401@qq.com> Date: 星期三, 17 八月 2022 13:22:02 +0800 Subject: [PATCH] tcp状态更新,iOS扫描 --- HDL_ON/DAL/DriverLayer/Control_TcpClient.cs | 178 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 126 insertions(+), 52 deletions(-) diff --git a/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs b/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs index aa8aeff..d6f61f1 100644 --- a/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs +++ b/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs @@ -1,7 +1,11 @@ 锘縰sing System; +using System.Collections.Generic; using System.Net; using System.Net.Sockets; +using System.Threading; using System.Threading.Tasks; +using HDL_ON.Entity; +using Newtonsoft.Json; namespace HDL_ON.DriverLayer { @@ -18,6 +22,16 @@ public Action<string> ReceiveEvent; /// <summary> + /// 杩炴帴娆℃暟 + /// </summary> + private int reconnectIndex = 0; + /// <summary> + /// 鏄惁杩炴帴鎴愬姛 + /// </summary> + public bool isConnected = false; + + + /// <summary> /// 鏋勯�犲嚱鏁� /// </summary> public Control_TcpClient(string serverIp) @@ -26,18 +40,22 @@ } //TCP杩炴帴 - public bool Connect(int _port = 8586) + private bool ConnectToTcp( ) { - if (string.IsNullOrEmpty(_ip) || _port == 0) + if (string.IsNullOrEmpty(_ip) ) { return false; } - _tcpClient = new TcpClient(); + if (_tcpClient == null) + { + _tcpClient = new TcpClient(); + } try { - _tcpClient.Connect(IPAddress.Parse(_ip), _port); + _tcpClient.Connect(IPAddress.Parse(_ip), 8586); Task.Run(new Action(ReceiveMessage));//寮�鍚嚎绋嬶紝涓嶅仠鎺ユ敹娑堟伅 - MainPage.Log($"鎵撳紑tcp client{_ip}:{_port}"); + MainPage.Log($"鎵撳紑tcp client{_ip}:8586"); + isConnected = true; } catch (Exception e) { @@ -46,6 +64,53 @@ } return true;//杩斿洖杩炴帴鐘舵�� } + /// <summary> + /// 杩炴帴tcp绾跨▼ + /// </summary> + private Thread connectThread; + + /// <summary> + /// 杩炴帴绾跨▼ + /// </summary> + public void Connect() + { + if(connectThread == null) + { + connectThread = new Thread(() => { + while (Control.Ins.GatewayOnline_Local) + { + if (_tcpClient == null) + { + ConnectToTcp(); + } + else + { + if (!_tcpClient.Connected) + { + try + { + //_tcpClient.ReceiveTimeout = + _tcpClient.Connect(IPAddress.Parse(_ip), 8586); + Task.Run(new Action(ReceiveMessage));//寮�鍚嚎绋嬶紝涓嶅仠鎺ユ敹娑堟伅 + } + catch (Exception ex) + { + MainPage.Log($"tcp閲嶈繛寮傚父:{ex.Message}"); + _tcpClient.Close(); + _tcpClient = null; + } + } + } + Thread.Sleep(1000); + + + } + }); + connectThread.Start(); + } + } + + /// <summary> /// 鍏抽棴杩炴帴 /// </summary> @@ -65,67 +130,76 @@ /// <param name="bytes">闇�瑕佸彂閫佺殑瀛楄妭</param> public void SendMessage(byte[] bytes) { - NetworkStream networkStream = _tcpClient.GetStream(); - if (networkStream.CanWrite) + if (_tcpClient.GetStream().CanWrite) { - networkStream.Write(bytes, 0, bytes.Length); + _tcpClient.GetStream().Write(bytes, 0, bytes.Length); } - //networkStream.Close(); } - /// <summary> - /// 鑾峰彇鍒楄〃鏁版嵁鍥炶皟鏂规硶 + /// 蹇冭烦鍖呯嚎绋� /// </summary> - public Action<string> GetListResponseAction; + private Thread heartBeatThread; + private DateTime heartBeatTime; + public void HeartBeat() + { + if(heartBeatThread == null) + { + heartBeatThread = new Thread(() => { + if(_tcpClient.Connected&&10 *1000 <(System.DateTime.Now - heartBeatTime).TotalMilliseconds) + { + var sendBytes = Control.Ins.ConvertSendBodyData(CommunicationTopic.ct.HeartBeat, ""); + SendMessage(sendBytes); + } + Thread.Sleep(100); + }); + heartBeatThread.Start(); + } + } + /// <summary> + /// 鎺ユ敹鏁版嵁绾跨▼ + /// </summary> + private Thread receiveThread; + //鎺ユ敹娑堟伅 public void ReceiveMessage() { - NetworkStream networkStream = _tcpClient.GetStream(); - while (true) + if(receiveThread == null) { - // 瀹氫箟涓�涓�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); - } + receiveThread = new Thread(() => { + while (true) + { + if(_tcpClient == null) + { + receiveThread.Abort(); + receiveThread = null; + return; + } + if (!_tcpClient.Connected) + { + MainPage.Log("tcp瀹㈡埛绔柇寮�浜嗚繛鎺�..."); + receiveThread.Abort(); + receiveThread = null; + isConnected = false; + return; + } - //// 灏嗘帴鍙楀埌鐨勬暟鎹瓨鍏ュ埌杈撳叆 arrMsgRec涓紱 - //int length = -1; - //try - //{ - // length = socketClient.Receive(arrMsgRec); // 鎺ユ敹鏁版嵁锛屽苟杩斿洖鏁版嵁鐨勯暱搴︼紱 - //} - //catch (Exception ex) - //{ - // MainPage.Log($"tcpListener error 1 : {ex.Message}"); + // 瀹氫箟涓�涓�2M鐨勭紦瀛樺尯锛� + byte[] arrMsgRec = new byte[1024 * 1024 * 2]; + int size = _tcpClient.GetStream().Read(arrMsgRec, 0, arrMsgRec.Length); + var tcpDataString = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, arrMsgRec.Length); - // Flag_Receive = false; - // // 浠庨�氫俊绾跨▼闆嗗悎涓垹闄よ涓柇杩炴帴鐨勯�氫俊绾跨▼瀵硅薄锛� - // string keystr = socketClient.RemoteEndPoint.ToString(); - // dic_ClientSocket.Remove(keystr);//鍒犻櫎瀹㈡埛绔瓧鍏镐腑璇ocket - // 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); - // } + if (!string.IsNullOrEmpty(tcpDataString)) + { + MainPage.Log($"灞�鍩熺綉tcp鏁版嵁鎺ユ敹"); + Control.Ins.ConvertReceiveData(arrMsgRec, null); - // MainPage.Log($"鎺ユ敹鏈嶅姟绔暟鎹�:{tcpDataString}"); - //} + } + } + }); + //receiveThread.IsBackground = true; + receiveThread.Start(); } } -- Gitblit v1.8.0