From 17e5dbd7bd0364e27a33f1a7dab91cf33d5dcabc Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期三, 04 三月 2026 11:52:12 +0800
Subject: [PATCH] 增强Redis缓存服务与设备通信优化
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs | 44 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 44 insertions(+), 0 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs
index 2c35f71..fcd5764 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs
@@ -3,13 +3,22 @@
using System.Linq;
using System.Net;
using System.Net.Sockets;
+using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
+using WIDESEAWCS_Core.Helper;
namespace WIDESEAWCS_Tasks.SocketServer
{
public partial class TcpSocketServer
{
+ /// <summary>
+ /// 异步启动TCP服务器,使其开始接受传入的客户端连接。
+ /// </summary>
+ /// <remarks>如果服务器已在运行或通过配置禁用,此方法将立即返回而不启动服务器。
+ /// 后续的客户端监控和接受操作在后台任务中运行。此方法不会阻塞调用线程。</remarks>
+ /// <param name="cancellationToken">可用于请求取消服务器启动及后续后台操作的取消令牌。</param>
+ /// <returns>表示异步启动操作的任务。当服务器开始监听连接时任务完成。</returns>
public Task StartAsync(CancellationToken cancellationToken)
{
if (IsRunning || !_options.Enabled)
@@ -34,6 +43,13 @@
return Task.CompletedTask;
}
+ //// <summary>
+ /// 异步停止服务器并等待所有活动客户端连接完成。
+ /// </summary>
+ /// <remarks>如果服务器未运行,此方法将立即返回而不执行任何操作。
+ /// 此方法确保所有客户端任务完成后才将服务器标记为已停止。</remarks>
+ /// <param name="cancellationToken">可用于在完成前取消停止操作的取消令牌。</param>
+ /// <returns>表示异步停止操作的任务。</returns>
public async Task StopAsync(CancellationToken cancellationToken)
{
if (!IsRunning)
@@ -58,6 +74,13 @@
IsRunning = false;
}
+ /// <summary>
+ /// 持续接受传入的TCP客户端连接,直到请求取消。
+ /// </summary>
+ /// <remarks>此方法旨在后台运行以处理新的客户端连接。
+ /// 如果监听器被释放或通过提供的令牌请求取消,循环将退出。</remarks>
+ /// <param name="cancellationToken">可用于请求取消接受循环的令牌。当请求取消时,循环将立即终止。</param>
+ /// <returns>表示异步接受循环操作的任务。</returns>
private async Task AcceptLoopAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
@@ -66,6 +89,7 @@
try
{
client = await _listener!.AcceptTcpClientAsync().WaitAsync(cancellationToken);
+ ConsoleHelper.WriteSuccessLine($"客户端上线:{client.Client.RemoteEndPoint.ToString()}");
}
catch (OperationCanceledException)
{
@@ -97,6 +121,12 @@
}
}
+ /// <summary>
+ /// 从内部集合中移除指定标识符的客户端,并释放相关资源。
+ /// </summary>
+ /// <remarks>此方法关闭客户端连接,释放任何关联的锁,并移除对客户端的所有引用,
+ /// 包括设备绑定和编码信息。通过对内部同步对象加锁确保线程安全。</remarks>
+ /// <param name="clientId">要移除的客户端的唯一标识符。不能为null或空。</param>
private void RemoveClient(string clientId)
{
lock (_syncRoot)
@@ -124,6 +154,13 @@
}
}
+ /// <summary>
+ /// 异步监控已连接的客户端,并断开超过配置超时时间闲置的客户端连接。
+ /// </summary>
+ /// <remarks>此方法持续检查闲置客户端,如果其不活动时间超过指定的空闲超时,则断开连接。
+ /// 监控循环将持续运行,直到通过提供的令牌请求取消。</remarks>
+ /// <param name="cancellationToken">可用于请求终止监控循环的取消令牌。</param>
+ /// <returns>表示异步监控操作的任务。</returns>
private async Task MonitorClientsAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
@@ -156,6 +193,13 @@
}
}
+ /// <summary>
+ /// 基于远程终端点获取指定TCP客户端的唯一标识符字符串。
+ /// </summary>
+ /// <remarks>返回的标识符适用于在日志记录或跟踪场景中区分客户端。
+ /// 如果客户端的远程终端点不可用,将生成GUID以确保唯一性。</remarks>
+ /// <param name="client">要获取标识符的TCP客户端。不能为null。</param>
+ /// <returns>表示客户端远程终端点的字符串(如果可用);否则为生成的新GUID字符串。</returns>
public static string GetClientId(TcpClient client)
{
return client.Client.RemoteEndPoint?.ToString() ?? Guid.NewGuid().ToString();
--
Gitblit v1.9.3