using System; using System.Collections.Generic; using Fort23.Core; using Fort23.UTool; using NetClientCore.TCP; using NetCore; using NetCore.ContentParse; using NetCore.Protocol; using NetCore.Protocol.MemoryPack; using Protocol.MemoryPack.MemoryMessage; using Protocol.Protocol.MemoryPack.MemoryMessage; using Utility; namespace GameLogic.NetworkClient { public class GameNetworkClient : Singleton, ILogicalParsing { private IConnection _connection; private Queue _sendRequestBuffers = new Queue(); private SendRequestBuffer _currSendRequestBuffer; private Queue _acceptRequestBuffers = new Queue(); public async CTask Connect(string ip, int port) { TCPClient tcpClient = new TCPClient(); await tcpClient.Connect(ip, port, this); _connection = tcpClient; StaticUpdater.Instance.AddRenderUpdateCallBack(Update); } public void Logic(object data, IConnection iConnection) { var memoryResponse = data as MemoryResponse; _acceptRequestBuffers.Enqueue(memoryResponse); } public void SendToServer(SendRequestBuffer sendRequestBuffer) { if (_currSendRequestBuffer == null) { Send(sendRequestBuffer); } else { _sendRequestBuffers.Enqueue(sendRequestBuffer); } } private void Send(SendRequestBuffer sendRequestBuffer) { _currSendRequestBuffer = sendRequestBuffer; _connection.SendData(sendRequestBuffer.MemoryRequest); } public void Update() { if (_currSendRequestBuffer == null && _sendRequestBuffers.Count > 0) { _currSendRequestBuffer = _sendRequestBuffers.Dequeue(); Send(_currSendRequestBuffer); } while (_acceptRequestBuffers.Count > 0) { var memoryResponse = _acceptRequestBuffers.Dequeue(); if (memoryResponse.RespomseType == RespomseType.Respomse) { try { if (_currSendRequestBuffer != null&&memoryResponse.GameSendType==_currSendRequestBuffer.MemoryRequest.GameSendType) { SendRequestBuffer sendRequestBuffer = _currSendRequestBuffer; _currSendRequestBuffer = null; sendRequestBuffer.callBack?.Invoke(memoryResponse); } } catch (Exception e) { LogTool.Error(e); } } } } protected override void ProDispose() { _currSendRequestBuffer = null; _sendRequestBuffers.Clear(); StaticUpdater.Instance.RemoveRenderUpdateCallBack(Update); _connection.Dispose(); } public void AddConnection(IConnection iConnection) { } public void RemoveConnection(IConnection iConnection) { } } }