From 7278264f027d62664a0209699d0f66a22fd06a8e Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期一, 13 四月 2026 10:24:04 +0800
Subject: [PATCH] feat: 更新依赖版本并优化MES接口调用
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs | 121 +++++++++++++++++++++++++++++++---------
1 files changed, 94 insertions(+), 27 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..afaa8ec 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs
@@ -1,39 +1,63 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
using System.Net;
using System.Net.Sockets;
-using System.Threading;
-using System.Threading.Tasks;
+using System.Text;
+using System.Text.Json;
+using System.IO;
+using WIDESEAWCS_Core.LogHelper;
namespace WIDESEAWCS_Tasks.SocketServer
{
public partial class TcpSocketServer
{
- public Task StartAsync(CancellationToken cancellationToken)
+ /// <summary>
+ /// 寮傛鍚姩 TCP Socket 鏈嶅姟鍣�
+ /// </summary>
+ /// <remarks>
+ /// 鍒涘缓 TCP 鐩戝惉鍣ㄥ苟寮�濮嬫帴鍙楀鎴风杩炴帴銆�
+ /// 濡傛灉鏈嶅姟鍣ㄥ凡鍦ㄨ繍琛屾垨琚鐢紝鐩存帴杩斿洖銆�
+ /// 鍚姩鍚庡惎鍔ㄦ帴鍙楀惊鐜拰瀹㈡埛绔洃鎺т换鍔°��
+ /// </remarks>
+ /// <param name="cancellationToken">鍙栨秷浠ょ墝</param>
+ /// <returns>鍚姩浠诲姟</returns>
+ public async Task StartAsync(CancellationToken cancellationToken)
{
if (IsRunning || !_options.Enabled)
{
- return Task.CompletedTask;
+ return;
}
+ // 瑙f瀽鐩戝惉鍦板潃
IPAddress ipAddress = IPAddress.Any;
if (IPAddress.TryParse(_options.IpAddress, out IPAddress? parsedAddress))
{
ipAddress = parsedAddress;
}
+ await Task.Delay(5000);
+
+ // 鍒涘缓鐩戝惉鍣�
_listener = new TcpListener(ipAddress, _options.Port);
_listener.Start(_options.Backlog);
_cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
IsRunning = true;
+ // 鍚姩鎺ュ彈瀹㈡埛绔繛鎺ュ惊鐜�
_ = AcceptLoopAsync(_cts.Token);
+
+ // 鍚姩瀹㈡埛绔洃鎺т换鍔★紙妫�鏌ョ┖闂茶秴鏃讹級
_monitorTask = Task.Run(() => MonitorClientsAsync(_cts.Token));
- return Task.CompletedTask;
+ return;
}
+ /// <summary>
+ /// 寮傛鍋滄 TCP Socket 鏈嶅姟鍣�
+ /// </summary>
+ /// <remarks>
+ /// 鍋滄鎺ュ彈鏂拌繛鎺ワ紝绛夊緟鎵�鏈夊鎴风浠诲姟瀹屾垚銆�
+ /// </remarks>
+ /// <param name="cancellationToken">鍙栨秷浠ょ墝</param>
+ /// <returns>鍋滄浠诲姟</returns>
public async Task StopAsync(CancellationToken cancellationToken)
{
if (!IsRunning)
@@ -41,9 +65,13 @@
return;
}
+ // 鍙戦�佸彇娑堜俊鍙�
_cts?.Cancel();
+
+ // 鍋滄鐩戝惉
_listener?.Stop();
+ // 绛夊緟鎵�鏈夊鎴风浠诲姟瀹屾垚
Task[] tasks;
lock (_syncRoot)
{
@@ -58,6 +86,17 @@
IsRunning = false;
}
+ /// <summary>
+ /// 寮傛鎺ュ彈瀹㈡埛绔繛鎺ョ殑涓诲惊鐜�
+ /// </summary>
+ /// <summary>
+ /// 寮傛鎺ュ彈瀹㈡埛绔繛鎺ョ殑涓诲惊鐜�
+ /// </summary>
+ /// <remarks>
+ /// 鍦ㄥ悗鍙扮嚎绋嬩腑鎸佺画鎺ュ彈鏂扮殑瀹㈡埛绔繛鎺ャ��
+ /// 褰撴湁鏂拌繛鎺ユ椂锛屽皢鍏舵坊鍔犲埌瀹㈡埛绔瓧鍏稿苟鍚姩娑堟伅澶勭悊浠诲姟銆�
+ /// </remarks>
+ /// <param name="cancellationToken">鍙栨秷浠ょ墝</param>
private async Task AcceptLoopAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
@@ -65,30 +104,23 @@
TcpClient? client = null;
try
{
+ // 绛夊緟瀹㈡埛绔繛鎺�
client = await _listener!.AcceptTcpClientAsync().WaitAsync(cancellationToken);
+ QuartzLogger.Info($"瀹㈡埛绔繛鎺�:{client.Client.RemoteEndPoint.ToString()}");
}
- catch (OperationCanceledException)
- {
- break;
- }
- catch (ObjectDisposedException)
- {
- break;
- }
+ catch (OperationCanceledException) { break; }
+ catch (ObjectDisposedException) { break; }
catch
{
- if (cancellationToken.IsCancellationRequested)
- {
- break;
- }
+ if (cancellationToken.IsCancellationRequested) break;
}
- if (client == null)
- {
- continue;
- }
+ if (client == null) continue;
+ // 鐢熸垚瀹㈡埛绔� ID锛堜娇鐢ㄨ繙绋嬬鐐瑰湴鍧�锛�
string clientId = GetClientId(client);
+
+ // 娣诲姞鍒板鎴风瀛楀吀
lock (_syncRoot)
{
_clients[clientId] = client;
@@ -97,25 +129,42 @@
}
}
+ /// <summary>
+ /// 绉婚櫎瀹㈡埛绔繛鎺�
+ /// </summary>
+ /// <remarks>
+ /// 鍏抽棴瀹㈡埛绔繛鎺ュ苟娓呯悊鐩稿叧璧勬簮锛�
+ /// - 鍏抽棴 TcpClient
+ /// - 閲婃斁淇″彿閲�
+ /// - 绉婚櫎娲昏穬鏃堕棿鍜岀紪鐮佽褰�
+ /// - 绉婚櫎璁惧缁戝畾
+ /// </remarks>
+ /// <param name="clientId">瑕佺Щ闄ょ殑瀹㈡埛绔敮涓�鏍囪瘑</param>
private void RemoveClient(string clientId)
{
lock (_syncRoot)
{
+ // 鍏抽棴骞剁Щ闄ゅ鎴风杩炴帴
if (_clients.TryGetValue(clientId, out var client))
{
try { client.Close(); } catch { }
_clients.Remove(clientId);
}
+ // 閲婃斁淇″彿閲�
if (_clientLocks.TryGetValue(clientId, out var sem))
{
_clientLocks.Remove(clientId);
sem.Dispose();
}
+ // 绉婚櫎娲昏穬鏃堕棿璁板綍
_clientLastActive.Remove(clientId);
+
+ // 绉婚櫎缂栫爜璁板綍
_clientEncodings.Remove(clientId);
+ // 绉婚櫎璁惧缁戝畾
var deviceIds = _deviceBindings.Where(kv => kv.Value == clientId).Select(kv => kv.Key).ToList();
foreach (var deviceId in deviceIds)
{
@@ -124,6 +173,14 @@
}
}
+ /// <summary>
+ /// 寮傛鐩戞帶瀹㈡埛绔┖闂茶秴鏃�
+ /// </summary>
+ /// <remarks>
+ /// 瀹氭湡妫�鏌ユ墍鏈夊鎴风鐨勬渶鍚庢椿璺冩椂闂达紝
+ /// 濡傛灉瓒呰繃绌洪棽瓒呮椂鏃堕棿锛屾柇寮�璇ュ鎴风杩炴帴銆�
+ /// </remarks>
+ /// <param name="cancellationToken">鍙栨秷浠ょ墝</param>
private async Task MonitorClientsAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
@@ -135,6 +192,7 @@
{
foreach (var kv in _clientLastActive)
{
+ // 妫�鏌ユ槸鍚﹁秴杩囩┖闂茶秴鏃�
if (_options.IdleTimeoutSeconds > 0 && DateTime.Now - kv.Value > TimeSpan.FromSeconds(_options.IdleTimeoutSeconds))
{
toRemove.Add(kv.Key);
@@ -142,20 +200,29 @@
}
}
+ // 鏂紑瓒呮椂鐨勫鎴风
foreach (var cid in toRemove)
{
RemoveClient(cid);
Log($"[{DateTime.Now}] TcpSocketServer disconnect idle client {cid}");
}
}
- catch
- {
- }
+ catch { }
+ // 姣忕妫�鏌ヤ竴娆�
try { await Task.Delay(1000, cancellationToken); } catch { }
}
}
+ /// <summary>
+ /// 鑾峰彇瀹㈡埛绔敮涓�鏍囪瘑
+ /// </summary>
+ /// <remarks>
+ /// 浣跨敤瀹㈡埛绔殑杩滅▼绔偣鍦板潃浣滀负鏍囪瘑銆�
+ /// 濡傛灉杩滅▼绔偣涓嶅彲鐢紝鐢熸垚闅忔満 GUID銆�
+ /// </remarks>
+ /// <param name="client">TCP 瀹㈡埛绔�</param>
+ /// <returns>瀹㈡埛绔爣璇嗗瓧绗︿覆</returns>
public static string GetClientId(TcpClient client)
{
return client.Client.RemoteEndPoint?.ToString() ?? Guid.NewGuid().ToString();
--
Gitblit v1.9.3