#region << 版 本 注 释 >>
/*--------------------------------------------------------------------
* 版权所有 (c) 2026 WenJY 保留所有权利。
* CLR版本:4.0.30319.42000
* 机器名称:Mr.Wen's MacBook Pro
* 命名空间:Sln.IntelliBelt.Socket
* 唯一标识:E0B382FE-A373-4B1C-9175-EC962B22F6A5
*
* 创建者:WenJY
* 电子邮箱:
* 创建时间:2026-04-24 10:48:20
* 版本:V1.0.0
* 描述:
*
*--------------------------------------------------------------------
* 修改人:
* 时间:
* 修改说明:
*
* 版本:V1.0.0
*--------------------------------------------------------------------*/
#endregion << 版 本 注 释 >>
using System.Collections.Concurrent;
using System.Text;
using Sln.IntelliBelt.Common;
using Sln.IntelliBelt.Serilog;
using Sln.IntelliBelt.Socket.Adapter;
using TouchSocket.Core;
using TouchSocket.Sockets;
namespace Sln.IntelliBelt.Socket;
public class TcpServer
{
private readonly SerilogHelper _logger;
private readonly TcpService _service;
private readonly StringChange _stringChange;
public TcpServer(SerilogHelper logger, TcpService service, StringChange stringChange)
{
_logger = logger;
_service = service;
_stringChange = stringChange;
}
public delegate void ReceivedClientBuffer(byte[] buffer);
public event ReceivedClientBuffer? ReceivedClientBufferEvent;
public delegate void RefreshClientInfo(TcpService tcpService);
public event RefreshClientInfo? RefreshClientInfoEvent;
public delegate void ReceivedBufferRequestInfo(TcpSessionClient client,BufferRequestInfo requestInfo);
public event ReceivedBufferRequestInfo ReceivedBufferRequestInfoEvent;
public void Init(int serverPort)
{
try
{
_service.Connecting = (client, e) => {
return EasyTask.CompletedTask;
};
_service.Connected = (client, e) => {
_logger.Info($"客户端{client.IP}:{client.Port}接入服务成功,Id:{client.Id}");
RefreshClientInfoEvent?.Invoke(_service);
return EasyTask.CompletedTask;
};
_service.Closed = (client, e) => {
_logger.Info($"客户端{client.IP}:{client.Port}断开连接");
RefreshClientInfoEvent?.Invoke(_service);
return EasyTask.CompletedTask;
};
_service.Received = (client, e) =>
{
if (e.RequestInfo is BufferRequestInfo request)
{
string msg = $"{client.Id}链接收到终端:{request.terminalAddr}指令====>>>>ContentLen:{request.contentLen};Content:{request.content};";
_logger.Info($"{msg}");
if (client.Id != request.terminalAddr)
{
_logger.Info($"更新连接 Id:{client.Id}==>{request.terminalAddr}");
client.ResetIdAsync(request.terminalAddr).Wait();
}
ReceivedBufferRequestInfoEvent?.Invoke(client, request);
}
return EasyTask.CompletedTask;
};
_service.SetupAsync(new TouchSocketConfig()//载入配置
.SetListenIPHosts(new IPHost[] { new IPHost($"0.0.0.0:{serverPort}") })
.SetTcpDataHandlingAdapter(() => new CustomDataHandlingAdapter(_logger,_stringChange))
.ConfigureContainer(a =>//容器的配置顺序应该在最前面
{
a.AddConsoleLogger();
})
.ConfigurePlugins(a =>
{
//自定义插件
}));
_service.StartAsync();
_logger.Info($"TcpServer启动成功,监听端口:{serverPort}");
}
catch (Exception ex)
{
_logger.Info($"TcpServer启动异常:{ex.Message}");
}
}
///
/// 向指定客户端发送指令,使用序号关联匹配应答,避免创建新的 TCP 连接
///
public async Task SendMsgToClient(string clientId, byte[] buffer)
{
if (_service.Clients.TryGetClient(clientId, out TcpSessionClient tcpSessionClient))
{
var waitClinet = tcpSessionClient.CreateWaitingClient(new WaitingOptions()
{
FilterFunc = response => //设置用于筛选的fun委托,当返回为true时,才会响应返回
{
return true;
}
});
Task responsedData = waitClinet.SendThenResponseAsync(buffer, 5000);
IRequestInfo requestInfo = responsedData.Result.RequestInfo;
BufferRequestInfo bufferRequestInfo = (BufferRequestInfo)requestInfo ;
return bufferRequestInfo;
}
else
{
return new BufferRequestInfo();
}
}
}