From fd18eaba5e1c086a588509371f91310e7aafff9c Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期三, 08 四月 2026 22:06:59 +0800
Subject: [PATCH] refactor: 升级多个项目目标框架至.NET 8.0
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.cs | 154 ++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 146 insertions(+), 8 deletions(-)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.cs
index 16371be..e08d58f 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.cs
@@ -11,53 +11,191 @@
namespace WIDESEAWCS_Tasks.SocketServer
{
/// <summary>
- /// TCP Socket服务端(基于行协议,按换行符分割消息)
+ /// TCP Socket 鏈嶅姟鍣� - 鏍稿績绫�
/// </summary>
+ /// <remarks>
+ /// 鏍稿績鑱岃矗锛�
+ /// 1. 鎺ュ彈瀹㈡埛绔� TCP 杩炴帴
+ /// 2. 绠$悊瀹㈡埛绔繛鎺ョ姸鎬�
+ /// 3. 鎺ユ敹鍜屽彂閫佹秷鎭�
+ /// 4. 澶勭悊璁惧娉ㄥ唽
+ /// 5. 娑堟伅甯цВ鏋愶紙鏀寔澶村熬鏍囪瘑锛�
+ ///
+ /// 鏈嶅姟鍣ㄤ娇鐢ㄤ互涓嬫暟鎹粨鏋勭鐞嗗鎴风锛�
+ /// - _clients: 瀹㈡埛绔� ID 鍒� TcpClient 鐨勬槧灏�
+ /// - _clientLocks: 瀹㈡埛绔� ID 鍒颁俊鍙烽噺鐨勬槧灏勶紙淇濊瘉姣忎釜瀹㈡埛绔殑鍙戦�佷簰鏂ワ級
+ /// - _deviceBindings: 璁惧 ID 鍒板鎴风 ID 鐨勬槧灏�
+ /// - _clientEncodings: 瀹㈡埛绔� ID 鍒扮紪鐮佺殑鏄犲皠锛堟敮鎸佽嚜鍔ㄧ紪鐮佹娴嬶級
+ /// - _clientLastActive: 瀹㈡埛绔� ID 鍒版渶鍚庢椿璺冩椂闂寸殑鏄犲皠
+ /// </remarks>
public partial class TcpSocketServer : IDisposable
{
+ /// <summary>
+ /// 鏈嶅姟鍣ㄩ厤缃�夐」
+ /// </summary>
private readonly SocketServerOptions _options;
- public readonly object _syncRoot = new();
+
+ /// <summary>
+ /// 鍚屾鏍瑰璞★紝鐢ㄤ簬绾跨▼鍚屾
+ /// </summary>
+ /// <remarks>
+ /// 鍦ㄥ绾跨▼璁块棶鍏变韩鏁版嵁缁撴瀯鏃朵娇鐢ㄦ瀵硅薄杩涜鍚屾銆�
+ /// 閲囩敤淇濆畧绛栫暐锛岀‘淇濈嚎绋嬪畨鍏ㄣ��
+ /// </remarks>
+ public readonly object _syncRoot = new object();
+
+ /// <summary>
+ /// TCP 鐩戝惉鍣�
+ /// </summary>
private TcpListener? _listener;
+
+ /// <summary>
+ /// 鍙栨秷浠ょ墝婧�
+ /// </summary>
+ /// <remarks>
+ /// 鐢ㄤ簬璇锋眰鍋滄鏈嶅姟鍣ㄧ殑杩愯銆�
+ /// </remarks>
public CancellationTokenSource? _cts;
+
+ /// <summary>
+ /// 瀹㈡埛绔换鍔″垪琛�
+ /// </summary>
+ /// <remarks>
+ /// 璁板綍鎵�鏈夋椿璺冨鎴风鐨勫鐞嗕换鍔°��
+ /// </remarks>
public readonly List<Task> _clientTasks = new();
+
+ /// <summary>
+ /// 瀹㈡埛绔繛鎺ュ瓧鍏�
+ /// </summary>
+ /// <remarks>
+ /// Key: 瀹㈡埛绔� ID锛堥�氬父鏄� IP:Port锛�
+ /// Value: TcpClient 杩炴帴瀵硅薄
+ /// </remarks>
public readonly Dictionary<string, TcpClient> _clients = new();
+
+ /// <summary>
+ /// 璁惧缁戝畾瀛楀吀
+ /// </summary>
+ /// <remarks>
+ /// Key: 璁惧 ID
+ /// Value: 瀹㈡埛绔� ID
+ /// 鐢ㄤ簬閫氳繃璁惧 ID 鎵惧埌瀵瑰簲鐨勫鎴风杩炴帴銆�
+ /// </remarks>
public readonly Dictionary<string, string> _deviceBindings = new();
+
+ /// <summary>
+ /// 瀹㈡埛绔攣瀛楀吀
+ /// </summary>
+ /// <remarks>
+ /// 姣忎釜瀹㈡埛绔竴涓� SemaphoreSlim锛岀‘淇濆悓涓�瀹㈡埛绔殑鍙戦�佹搷浣滀簰鏂ャ��
+ /// </remarks>
public readonly Dictionary<string, SemaphoreSlim> _clientLocks = new();
+
+ /// <summary>
+ /// 瀹㈡埛绔紪鐮佸瓧鍏�
+ /// </summary>
+ /// <remarks>
+ /// 璁板綍姣忎釜瀹㈡埛绔娇鐢ㄧ殑瀛楃缂栫爜銆�
+ /// 鏀寔鑷姩妫�娴嬶細UTF-8 鎴� GBK銆�
+ /// </remarks>
public readonly Dictionary<string, Encoding> _clientEncodings = new();
+
+ /// <summary>
+ /// 瀹㈡埛绔渶鍚庢椿璺冩椂闂村瓧鍏�
+ /// </summary>
+ /// <remarks>
+ /// 璁板綍姣忎釜瀹㈡埛绔渶鍚庝竴娆℃椿鍔ㄧ殑鏃堕棿銆�
+ /// 鐢ㄤ簬绌洪棽瓒呮椂妫�娴嬨��
+ /// </remarks>
public readonly Dictionary<string, DateTime> _clientLastActive = new();
+
+ /// <summary>
+ /// 榛樿鏂囨湰缂栫爜
+ /// </summary>
public readonly Encoding _textEncoding;
+
+ /// <summary>
+ /// 鑷姩妫�娴嬬殑 GBK 缂栫爜
+ /// </summary>
public readonly Encoding? _autoDetectedGb2312;
+
+ /// <summary>
+ /// 鏃ュ織鏂囦欢璺緞
+ /// </summary>
private readonly string _logFile;
+
+ /// <summary>
+ /// 瀹㈡埛绔洃鎺т换鍔�
+ /// </summary>
private Task? _monitorTask;
+ /// <summary>
+ /// 鏈嶅姟鍣ㄦ槸鍚︽鍦ㄨ繍琛�
+ /// </summary>
+ public bool IsRunning { get; private set; }
+
+ /// <summary>
+ /// 娑堟伅鎺ユ敹浜嬩欢
+ /// </summary>
+ /// <remarks>
+ /// 褰撴湇鍔″櫒鎺ユ敹鍒版秷鎭椂瑙﹀彂銆�
+ /// 鍙傛暟锛氭秷鎭唴瀹广�佹槸鍚� JSON 鏍煎紡銆乀CP 瀹㈡埛绔�佹満鍣ㄤ汉鐘舵��
+ /// </remarks>
+ public event Func<string, bool, TcpClient, RobotSocketState, Task<string?>>? MessageReceived;
+
+ /// <summary>
+ /// 鏈哄櫒浜鸿繛鎺ユ柇寮�浜嬩欢
+ /// </summary>
+ /// <remarks>
+ /// 褰撴満鍣ㄤ汉瀹㈡埛绔柇寮�杩炴帴鏃惰Е鍙戙��
+ /// 鍙傛暟锛氬鎴风 ID
+ /// </remarks>
+ public event Func<string, Task<string?>>? RobotReceived;
+
+ /// <summary>
+ /// 鏋勯�犲嚱鏁�
+ /// </summary>
+ /// <remarks>
+ /// 浣跨敤鎸囧畾鐨勯厤缃�夐」鍒濆鍖� TcpSocketServer 瀹炰緥銆�
+ /// 閰嶇疆椤瑰寘鎷細绔彛銆佸瓧绗︾紪鐮併�佽嚜鍔ㄧ紪鐮佹娴嬨�佹棩蹇楁枃浠惰矾寰勭瓑銆�
+ /// </remarks>
+ /// <param name="options">Socket 鏈嶅姟鍣ㄩ厤缃�夐」</param>
public TcpSocketServer(IOptions<SocketServerOptions> options)
{
_options = options.Value;
+
+ // 閰嶇疆瀛楃缂栫爜
if (_options.AutoDetectEncoding)
{
+ // 鑷姩妫�娴嬬紪鐮佹ā寮忥細榛樿 UTF-8锛屼篃鏀寔 GBK
_textEncoding = Encoding.UTF8;
try { _autoDetectedGb2312 = Encoding.GetEncoding("GBK"); } catch { _autoDetectedGb2312 = null; }
}
else
{
+ // 鎸囧畾缂栫爜妯″紡
try { _textEncoding = Encoding.GetEncoding(_options.EncodingName ?? "utf-8"); }
catch { _textEncoding = Encoding.UTF8; }
_autoDetectedGb2312 = null;
}
+ // 閰嶇疆鏃ュ織鏂囦欢璺緞
_logFile = Path.Combine(AppContext.BaseDirectory ?? ".", _options.LogFilePath ?? "socketserver.log");
Log($"[{DateTime.Now}] TcpSocketServer starting");
}
- public bool IsRunning { get; private set; }
-
- public event Func<string, bool, TcpClient, RobotSocketState, Task<string?>>? MessageReceived;
- public event Func<string, Task<string?>>? RobotReceived;
-
+ /// <summary>
+ /// 璁板綍鏃ュ織
+ /// </summary>
+ /// <remarks>
+ /// 灏嗘秷鎭緭鍑哄埌鎺у埗鍙板苟鍐欏叆鏃ュ織鏂囦欢銆�
+ /// </remarks>
+ /// <param name="message">鏃ュ織娑堟伅</param>
private void Log(string message)
{
Console.WriteLine(message);
try { File.AppendAllText(_logFile, message + Environment.NewLine); } catch { }
}
}
-}
\ No newline at end of file
+}
--
Gitblit v1.9.3