using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; using TouchSocket.Core; using TouchSocket.Sockets; namespace SlnMesnac.TouchSocket { public class TcpServer { private ILogger _logger; private readonly TcpService _service; /// /// 接收客户端指令委托 /// public delegate void ReceivedClientBuffer(byte[] buffer); public event ReceivedClientBuffer? ReceivedClientBufferEvent; public delegate void RefreshClientInfo(TcpService tcpService); public event RefreshClientInfo? RefreshClientInfoEvent; public TcpServer(ILogger logger,TcpService tcpService) { _logger = logger; _service = tcpService; } public void Init(int serverPort) { try { _service.Connecting = (client, e) => { _logger.LogInformation($"客户端{client.IP}正在接入服务"); return EasyTask.CompletedTask; }; _service.Connected = (client, e) => { _logger.LogInformation($"客户端{client.IP}接入服务成功"); RefreshClientInfoEvent?.Invoke(_service); return EasyTask.CompletedTask; }; _service.Disconnected = (client, e) => { _logger.LogInformation($"客户端{client.IP}断开连接"); RefreshClientInfoEvent?.Invoke(_service); return EasyTask.CompletedTask; }; _service.Received = (client, e) => { //从客户端收到信息 var mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);//注意:数据长度是byteBlock.Len byte[] receivedBuffer = new byte[e.ByteBlock.Len]; Array.Copy(e.ByteBlock.Buffer, 0, receivedBuffer, 0, e.ByteBlock.Len); ReceivedClientBufferEvent?.Invoke(receivedBuffer); return EasyTask.CompletedTask; }; _service.Setup(new TouchSocketConfig()//载入配置 .SetListenIPHosts(new IPHost[] { new IPHost($"0.0.0.0:{serverPort}") }) .ConfigureContainer(a =>//容器的配置顺序应该在最前面 { a.AddConsoleLogger(); }) .ConfigurePlugins(a => { //自定义插件 })); _service.Start(); _logger.LogInformation($"TcpServer启动成功,监听端口:{serverPort}"); } catch (Exception ex) { //throw new InvalidOperationException($"TcpServer启动异常:{ex.Message}"); _logger.LogError($"TcpServer启动异常:{ex.Message}"); } } /// /// 向所有客户端发送心跳 /// public void SendHeartBeat() { var clients = _service.SocketClients.GetClients(); foreach (var item in clients) { _service.Send(item.Id,"heartbeat"); } } } }