wangxinhui
2026-04-20 5d9c24c02c8685fd931e0ae93e54c811726af8c6
´úÂë¹ÜÀí/Mould/WCS/WCSServers/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Messaging.cs
copy from "\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WCSServers/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Messaging.cs" copy to "\344\273\243\347\240\201\347\256\241\347\220\206/Mould/WCS/WCSServers/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Messaging.cs"
Îļþ´Ó ´úÂë¹ÜÀí/WCS/WCSServers/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Messaging.cs ¸´ÖÆ
@@ -2,6 +2,7 @@
using System.Text;
using System.Text.Json;
using System.IO;
using WIDESEAWCS_Tasks.StackerCraneJob;
namespace WIDESEAWCS_Tasks.SocketServer
{
@@ -18,7 +19,7 @@
        /// <param name="cancellationToken">可用于取消客户端处理操作的取消令牌。如果请求取消,方法将立即终止处理。</param>
        /// <param name="stackerState">表示与客户端关联的机器人起重机的当前状态对象。用于为消息处理和事件调用提供上下文。</param>
        /// <returns>表示处理客户端连接的异步操作的任务。当客户端断开连接或请求取消时任务完成。</returns>
        public async Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken, StackerSocketState stackerState)
        public async Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken, StackerSocketState_BTI stackerState)
        {
            using (client)
            using (NetworkStream networkStream = client.GetStream())
@@ -56,18 +57,14 @@
                        string messageLower = message.ToLowerInvariant();
                        if (TryHandleRegister(messageLower, message, clientId, networkStream, cancellationToken))
                        {
                            continue;
                        }
                        if (MessageReceived != null)
                        if (MessageReceivedBTI != null)
                        {
                            try
                            {
                                // åˆ¤æ–­æ˜¯å¦ä¸º JSON æ ¼å¼
                                bool isJsonFormat = TryParseJsonSilent(message);
                                _ = MessageReceived.Invoke(message, isJsonFormat, client, stackerState);
                                _ = MessageReceivedBTI.Invoke(message, isJsonFormat, client, stackerState);
                            }
                            catch { }
                        }
@@ -77,7 +74,135 @@
                {
                    try { localCts?.Cancel(); localCts?.Dispose(); } catch { }
                    RemoveClient(clientId);
                    try { _ = RobotReceived.Invoke(clientId); } catch { }
                    try { _ = StackerReceivedBTI.Invoke(clientId); } catch { }
                }
            }
        }
        public async Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken, StackerSocketState_CP01 stackerState)
        {
            using (client)
            using (NetworkStream networkStream = client.GetStream())
            using (StreamReader reader = new(networkStream, _textEncoding, false, 1024, true))
            using (StreamWriter writer = new(networkStream, _textEncoding, 1024, true) { AutoFlush = true })
            {
                CancellationTokenSource? localCts = null;
                if (_options.EnableHeartbeat || _options.IdleTimeoutSeconds > 0)
                {
                    localCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
                }
                try
                {
                    while (!cancellationToken.IsCancellationRequested && client.Connected)
                    {
                        string? message;
                        try
                        {
                            var ct = localCts?.Token ?? cancellationToken;
                            message = await ReceiveFullMessageAsync(networkStream, _textEncoding, ct);
                            //message = await reader.ReadLineAsync().WaitAsync(ct);
                        }
                        catch (OperationCanceledException)
                        {
                            break;
                        }
                        if (message == null)
                        {
                            break;
                        }
                        UpdateClientStatus(clientId, message);
                        string messageLower = message.ToLowerInvariant();
                        //if (TryHandleRegister(messageLower, message, clientId, networkStream, cancellationToken))
                        //{
                        //    continue;
                        //}
                        if (MessageReceivedCP01 != null)
                        {
                            try
                            {
                                // åˆ¤æ–­æ˜¯å¦ä¸º JSON æ ¼å¼
                                bool isJsonFormat = TryParseJsonSilent(message);
                                _ = MessageReceivedCP01.Invoke(message, isJsonFormat, client, stackerState);
                            }
                            catch { }
                        }
                    }
                }
                finally
                {
                    try { localCts?.Cancel(); localCts?.Dispose(); } catch { }
                    RemoveClient(clientId);
                    try { _ = StackerReceivedCP01.Invoke(clientId); } catch { }
                }
            }
        }
        public async Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken, StackerSocketState_CP02 stackerState)
        {
            using (client)
            using (NetworkStream networkStream = client.GetStream())
            using (StreamReader reader = new(networkStream, _textEncoding, false, 1024, true))
            using (StreamWriter writer = new(networkStream, _textEncoding, 1024, true) { AutoFlush = true })
            {
                CancellationTokenSource? localCts = null;
                if (_options.EnableHeartbeat || _options.IdleTimeoutSeconds > 0)
                {
                    localCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
                }
                try
                {
                    while (!cancellationToken.IsCancellationRequested && client.Connected)
                    {
                        string? message;
                        try
                        {
                            var ct = localCts?.Token ?? cancellationToken;
                            message = await ReceiveFullMessageAsync(networkStream, _textEncoding, ct);
                            //message = await reader.ReadLineAsync().WaitAsync(ct);
                        }
                        catch (OperationCanceledException)
                        {
                            break;
                        }
                        if (message == null)
                        {
                            break;
                        }
                        UpdateClientStatus(clientId, message);
                        string messageLower = message.ToLowerInvariant();
                        //if (TryHandleRegister(messageLower, message, clientId, networkStream, cancellationToken))
                        //{
                        //    continue;
                        //}
                        if (MessageReceivedCP02 != null)
                        {
                            try
                            {
                                // åˆ¤æ–­æ˜¯å¦ä¸º JSON æ ¼å¼
                                bool isJsonFormat = TryParseJsonSilent(message);
                                _ = MessageReceivedCP02.Invoke(message, isJsonFormat, client, stackerState);
                            }
                            catch { }
                        }
                    }
                }
                finally
                {
                    try { localCts?.Cancel(); localCts?.Dispose(); } catch { }
                    RemoveClient(clientId);
                    try { _ = StackerReceivedCP02.Invoke(clientId); } catch { }
                }
            }
        }
@@ -96,21 +221,21 @@
        /// <returns>如果消息被识别并作为注册请求处理,则返回 true;否则返回 false。</returns>
        private bool TryHandleRegister(string messageLower, string message, string clientId, NetworkStream networkStream, CancellationToken cancellationToken)
        {
            if (!messageLower.StartsWith("register,"))
            {
                return false;
            }
            //if (!messageLower.StartsWith("register,"))
            //{
            //    return false;
            //}
            string deviceId = message.Substring("register,".Length).Trim();
            if (!string.IsNullOrEmpty(deviceId))
            {
            //string deviceId = message.Substring("register,".Length).Trim();
            //if (!string.IsNullOrEmpty(deviceId))
            //{
                lock (_syncRoot)
                {
                    _deviceBindings[deviceId] = clientId;
                    _deviceBindings[clientId] = clientId;
                }
                _ = WriteToClientAsync(clientId, networkStream, $"Registered,{deviceId}", cancellationToken);
            }
                _ = WriteToClientAsync(clientId, networkStream, $"Registered,{clientId}", cancellationToken);
            //}
            return true;
        }