wxr
2021-07-01 43b0d5870d528f23ecd6aeceb6cfd4325188b46f
HDL_ON/DAL/DriverLayer/Control_TcpClient.cs
New file
@@ -0,0 +1,134 @@
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<string> ReceiveEvent;
        /// <summary>
        /// 构造函数
        /// </summary>
        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;//返回连接状态
        }
        /// <summary>
        /// 关闭连接
        /// </summary>
        /// <returns></returns>
        public bool Close()
        {
            if (_tcpClient == null)
                return true;
            _tcpClient.Close();
            _tcpClient = null;
            return true;
        }
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="bytes">需要发送的字节</param>
        public void SendMessage(byte[] bytes)
        {
            NetworkStream networkStream = _tcpClient.GetStream();
            if (networkStream.CanWrite)
            {
                networkStream.Write(bytes, 0, bytes.Length);
            }
            //networkStream.Close();
        }
        /// <summary>
        /// 获取列表数据回调方法
        /// </summary>
        public Action<string> 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}");
                //}
            }
        }
    }
}