| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 | using System;using System.Net;using System.Net.Sockets;using System.Threading;using System.Threading.Tasks;using Fort23.UTool;using NetCore;using NetCore.ContentParse;using NetCore.Protocol;namespace NetClientCore.TCP{    public class TCPClient<T, K> : IContentReceiver, IConnection        where T : IContentParse where K : IProtocol    {        private Socket socket;        public long ConnectionId { get; set; }        private byte[] buffData = new byte[655300];        public bool isConnected { get; set; }        public IContentParse iContentParse        {            get { return _iContentParse; }        }        public IProtocol iProtocol        {            get { return _iProtocol; }        }        private IContentParse _iContentParse;        public IProtocol _iProtocol;        private Thread _udpClientThread;        private Thread _heartbeat;        private ILogicalParsing LogicalParsing;        public async Task Connect(string ip, int port, ILogicalParsing LogicalParsing)        {            this.LogicalParsing = LogicalParsing;            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            await socket.ConnectAsync(ip, port);            _iContentParse = Activator.CreateInstance<T>();            _iProtocol = Activator.CreateInstance<K>();            _udpClientThread = new Thread(TheUpdate);            _udpClientThread.Start();            _heartbeat = new Thread(HeartbeatUpdate);            _heartbeat.Start();        }        private void HeartbeatUpdate()        {            while (socket != null)            {                SendHeartbeat();                Thread.Sleep(10000);            }        }        private void TheUpdate()        {            while (socket != null)            {                try                {                    int count = socket.Receive(buffData);                    if (count <= 0)                    {                        Thread.Sleep(1);                        return;                    }                    byte[] data = new byte[count];                    Array.Copy(buffData, 0, data, 0, count);                    _iContentParse.ParseByte(data, _iProtocol, this);                    // LogTool.Log("数据来了" + count);                }                catch (Exception e)                {                    LogTool.Error(e);                    isConnected = false;                    break;                }            }            LogTool.Log("服务器执行完毕");        }        public void AddContent(byte[] data)        {            if (data == null)            {                return;            }            if (data.Length == 1 && data[0] == 1)            {                // 心跳                return;            }            object serializeData = iProtocol.Deserialize(data);            LogicalParsing.Logic(serializeData, this);        }        public void SendData(object sendData)        {            byte[] data = iProtocol.Serialize(sendData);            byte[] parseData = _iContentParse.AssembleByte(data);            socket.SendAsync(parseData, SocketFlags.None);        }        /// <summary>        /// 发送心跳        /// </summary>        private void SendHeartbeat()        {            byte[] bytes = new byte[] { 1 };            byte[] parseData = _iContentParse.AssembleByte(bytes);            socket.SendAsync(parseData, SocketFlags.None);        }        public void Dispose()        {            socket?.Dispose();            socket?.Close();            socket = null;            _iContentParse = null;            _iProtocol = null;            _udpClientThread = null;            _heartbeat = null;            LogicalParsing = null;        }    }}
 |