wxr
2022-08-17 d6578b10542226650e263815dea75e598a7090f9
HDL_ON/DAL/DriverLayer/Control_TcpClient.cs
@@ -1,7 +1,11 @@
using 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);//删除客户端字典中该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);
                //    }
                        if (!string.IsNullOrEmpty(tcpDataString))
                        {
                            MainPage.Log($"局域网tcp数据接收");
                            Control.Ins.ConvertReceiveData(arrMsgRec, null);
                //    MainPage.Log($"接收服务端数据:{tcpDataString}");
                //}
                        }
                    }
                });
                //receiveThread.IsBackground = true;
                receiveThread.Start();
            }
        }