| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 | #if COMBAT_SERVERusing System;using System.Collections.Generic;using System.IO.Compression;using System.Net;using System.Net.Sockets;using System.Threading;using Com.Fort23.Protocol.Protobuf;using Fort23.UTool;using Utility;using Task = System.Threading.Tasks.Task;namespace Core.KCPTool{    public class TCPServer : IServer    {        private byte[] buffData = new byte[6553];        private Socket socket;        //记录半包数据        private bool isBufferData;        private byte[] lastBuffData;        private int lastCount;        private short lastXueLieHao;        //数据结束        //尾包        private byte[] weiBaoBuffData;        // private Thread _udpClientThread;        private byte[] buffer = new byte[2048];        public Map<long, IServerConnection> KcpServerConnections = new Map<long, IServerConnection>();        private List<CombatSynchronizeRequest> CombatSynchronizeRequests = new List<CombatSynchronizeRequest>();        private List<IServerConnection> awaitConnections = new List<IServerConnection>();        private IServerManager iServerManager;        public TCPServer(int port, IServerManager iServerManager)        {            LogTool.Log("创建TCP链接端口"+port+"__");            this.iServerManager = iServerManager;            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            socket.Bind(new IPEndPoint(IPAddress.Any, port));            socket.Listen();            AcceptAsync();        }        public void AddCombatSynchronizeRequest(CombatSynchronizeRequest combatSynchronizeRequest)        {            lock (CombatSynchronizeRequests)            {                CombatSynchronizeRequests.Add(combatSynchronizeRequest);            }        }        public CombatSynchronizeRequest[] GetCombatSynchronizeRequest(bool isClear)        {            if (CombatSynchronizeRequests.Count <= 0)            {                return null;            }            lock (CombatSynchronizeRequests)            {                CombatSynchronizeRequest[] allData = CombatSynchronizeRequests.ToArray();                CombatSynchronizeRequests.Clear();                return allData;            }        }        private byte[] AssembleData(SendDataType sendDataType, byte[] buffer)        {            byte[] sendBuff = new byte[buffer.Length + 5];            sendBuff[0] = (byte)sendDataType;            byte[] zcd = SocketTool.IntToByte(buffer.Length);            sendBuff[1] = zcd[0];            sendBuff[2] = zcd[1];            sendBuff[3] = zcd[2];            sendBuff[4] = zcd[3];            Array.Copy(buffer, 0, sendBuff, 5, buffer.Length);            return sendBuff;        }        public bool SendToPlayer(SendDataType sendDataType, CombatSynchronizeType combatSynchronizeType, byte[] buffer,            long playerId)        {            if (KcpServerConnections.Count <= 0)            {                return true;            }            long t = System.DateTime.Now.Ticks;            byte[] sendBuff = AssembleData(sendDataType, buffer);            long t2 = System.DateTime.Now.Ticks;            bool isOk = false;            lock (KcpServerConnections)            {                for (KcpServerConnections.Begin(); KcpServerConnections.Next();)                {                    if (KcpServerConnections.Value.isConnected)                    {                        isOk = true;                    }                    if (playerId != -1 && KcpServerConnections.Value.playerId != playerId)                    {                        continue;                    }                    KcpServerConnections.Value.SendData(sendBuff, sendBuff.Length);                }            }            return isOk;        }        public IServerConnection GetConnection(int connectionId)        {            lock (KcpServerConnections)            {                for (KcpServerConnections.Begin(); KcpServerConnections.Next();)                {                    if (connectionId != -1 && KcpServerConnections.Value.connectionID != connectionId)                    {                        continue;                    }                    return KcpServerConnections.Value;                }            }            return null;        }        public async void SendGameFrame(int gameFrame, IServerConnection kcpServerConnection)        {            // if (gameFrame > 0)            {                LogTool.Log("重传数据开始" + gameFrame);                int maxCount = iServerManager.GetSendBufferSize();                for (int i = gameFrame; i < maxCount; i++)                {                    byte[] _sendBufferdata = iServerManager.GetSendBuffer(i);                    if (_sendBufferdata != null)                    {                        _sendBufferdata = AssembleData(SendDataType.Data,_sendBufferdata);                        kcpServerConnection.SendData(_sendBufferdata, _sendBufferdata.Length);                        await Task.Delay(1);                    }                }            }        }        public void AddServerConnection(long playerId, int gameFrame, IServerConnection kcpServerConnection)        {            lock (KcpServerConnections)            {                if (KcpServerConnections.TryGetValue(playerId, out var connection))                {                    LogTool.Log("移除成功TCP" + playerId);                    connection.Dispose();                    KcpServerConnections.Remove(playerId);                }                KcpServerConnections.Add(playerId, kcpServerConnection);            }            lock (awaitConnections)            {                awaitConnections.Remove(kcpServerConnection);            }            LogTool.Log("握手成功TCP" + playerId);            iServerManager.AddServerConnection(this, kcpServerConnection);            byte[] data = SocketTool.LongToByte(playerId);            SendToPlayer(SendDataType.ShakeHands, CombatSynchronizeType.PrepareStart, data, playerId);        }        public void RemoveServerConnection(long playerId)        {            lock (KcpServerConnections)            {                if (KcpServerConnections.TryGetValue(playerId, out IServerConnection serverConnection))                {                    LogTool.Log("移除成功TCP" + playerId);                    serverConnection.Dispose();                    KcpServerConnections.Remove(playerId);                }            }        }        public IServerConnection GetConnection(long playerId)        {            lock (KcpServerConnections)            {                for (KcpServerConnections.Begin(); KcpServerConnections.Next();)                {                    if (playerId != -1 && KcpServerConnections.Value.playerId != playerId)                    {                        continue;                    }                    return KcpServerConnections.Value;                }            }            return null;        }        public void ConnectionUpdate()        {        }        private async void AcceptAsync()        {            try            {                if (socket == null)                {                    return;                }                Socket newSocket = await socket.AcceptAsync();                int code = newSocket.RemoteEndPoint.GetHashCode();                TCPServerConnection tcpServerConnection = new TCPServerConnection(this, newSocket);                tcpServerConnection.connectionID = code;                awaitConnections.Add(tcpServerConnection);                AcceptAsync();            }            catch (Exception e)            {                LogTool.Error(e);            }        }        public void Dispose()        {            socket?.Dispose();            socket = null;            for (KcpServerConnections.Begin(); KcpServerConnections.Next();)            {                KcpServerConnections.Value.Dispose();            }            KcpServerConnections.Clear();            CombatSynchronizeRequests.Clear();            awaitConnections.Clear();        }    }}#endif
 |