From e57938fbda9bff702004038f76d009422968bff5 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期五, 06 十一月 2026 18:05:07 +0800
Subject: [PATCH] 提交代码

---
 DeviceService/ServiceManager/NamePipe/NamePipeClient.cs |  180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 180 insertions(+), 0 deletions(-)

diff --git a/DeviceService/ServiceManager/NamePipe/NamePipeClient.cs b/DeviceService/ServiceManager/NamePipe/NamePipeClient.cs
new file mode 100644
index 0000000..e092026
--- /dev/null
+++ b/DeviceService/ServiceManager/NamePipe/NamePipeClient.cs
@@ -0,0 +1,180 @@
+锘縰sing System.IO;
+using System.IO.Pipes;
+using System.Text;
+
+namespace DeviceService.Service.NamePipe
+{
+    /// <summary>
+    /// 鍛藉悕绠¢亾瀹㈡埛绔繛鎺ュ皝瑁呫��
+    /// 姣忎釜瀹炰緥瀵瑰簲绠¢亾鏈嶅姟绔笂鐨勪竴鏉″凡寤虹珛杩炴帴锛屾敹鍙戝潎閫氳繃 <see cref="StreamReader"/> / <see cref="StreamWriter"/> 瀹屾垚銆�
+    /// 鍗忚绾﹀畾锛氭瘡鏉℃秷鎭负涓�琛� UTF-8 鏂囨湰锛堜互 \n 缁撳熬锛夛紝鍙戦�佺鍗曟鍐欏叆鈥滃唴瀹�+鎹㈣鈥濓紝
+    /// 浣� Message 妯″紡涓嬩竴鏉℃秷鎭伆濂芥槸瀹屾暣鐨勪竴琛屻��
+    /// </summary>
+    public class NamePipeClient : IClient, IDisposable
+    {
+        /// <summary>鍗曟潯娑堟伅鍏佽鐨勬渶澶у瓧鑺傛暟锛�16MB锛夈��</summary>
+        internal const int MaxMessageLength = 16 * 1024 * 1024;
+
+        /// <summary>绛夊緟鍙戦�侀攣鐨勮秴鏃舵椂闂达紙姣锛夈��</summary>
+        private const int SendLockTimeout = 5000;
+
+        /// <summary>娑堟伅琛岀粨鏉熺銆係treamWriter 姣忔鍐欏叆閮戒細瑙﹀彂 AutoFlush锛屽繀椤讳笌鍐呭鍦ㄥ悓涓�娆� Write 涓啓鍏ャ��</summary>
+        private const char LineEnding = '\n';
+
+        private readonly NamedPipeServerStream _stream;
+        private readonly StreamWriter writer;
+        private readonly StreamReader reader;
+        private readonly SemaphoreSlim _sendLock = new SemaphoreSlim(1, 1);
+        private volatile bool _disposed;
+
+        public NamePipeClient(NamedPipeServerStream serverStream)
+        {
+            var encoding = new UTF8Encoding(false);
+            _stream = serverStream;
+
+            reader = new StreamReader(serverStream, encoding, false, 1024, true);
+            writer = new StreamWriter(serverStream, encoding, 1024, true) { AutoFlush = true };
+        }
+
+        /// <summary>杩炴帴鏄惁浠嶇劧鍙敤銆�</summary>
+        public bool IsConnected
+        {
+            get
+            {
+                if (_disposed)
+                {
+                    return false;
+                }
+                return _stream.IsConnected;
+            }
+        }
+
+        public bool Send(string data, out string msg)
+        {
+            if (data == null)
+            {
+                msg = "寰呭彂閫佺殑鏁版嵁涓嶈兘涓虹┖銆�";
+                return false;
+            }
+
+            return SendLine(data, Encoding.UTF8.GetByteCount(data) + 1, out msg);
+        }
+
+        public bool Send(byte[] data, out string msg)
+        {
+            if (data == null)
+            {
+                msg = "寰呭彂閫佺殑鏁版嵁涓嶈兘涓虹┖銆�";
+                return false;
+            }
+
+            // 璐熻浇鎸� UTF-8 鏂囨湰澶勭悊锛屼笌琛屽崗璁繚鎸佷竴鑷�
+            return SendLine(Encoding.UTF8.GetString(data), data.Length + 1, out msg);
+        }
+
+        /// <summary>
+        /// 鍐欏叆涓�琛屾秷鎭�傚唴瀹逛笌鎹㈣绗﹀繀椤诲崟娆� Write 鍐欏叆锛岄厤鍚� AutoFlush 鎵嶈兘鎴愪负涓�鏉″畬鏁存秷鎭��
+        /// </summary>
+        private bool SendLine(string text, int byteLength, out string msg)
+        {
+            if (byteLength > MaxMessageLength)
+            {
+                msg = $"鏁版嵁闀垮害 {byteLength} 瀛楄妭瓒呰繃鍗曟潯娑堟伅涓婇檺 {MaxMessageLength} 瀛楄妭銆�";
+                return false;
+            }
+
+            if (_disposed)
+            {
+                msg = "绠¢亾杩炴帴宸插叧闂紝鏃犳硶鍙戦�佹暟鎹��";
+                return false;
+            }
+
+            if (!IsConnected)
+            {
+                msg = "绠¢亾杩炴帴宸叉柇寮�锛屾棤娉曞彂閫佹暟鎹��";
+                return false;
+            }
+
+            bool lockTaken = false;
+            try
+            {
+                lockTaken = _sendLock.Wait(SendLockTimeout);
+                if (!lockTaken)
+                {
+                    msg = "鍙戦�佽秴鏃讹細涓婁竴鏉℃暟鎹粛鏈啓鍑恒��";
+                    return false;
+                }
+
+                // writer 闈� thread-safe锛岀粺涓�鐢� _sendLock 涓茶鍖�
+                writer.Write(text + LineEnding);
+                writer.Flush();
+                msg = string.Empty;
+                return true;
+            }
+            catch (Exception ex)
+            {
+                msg = $"鍙戦�佸け璐ワ細{ex.Message}";
+                return false;
+            }
+            finally
+            {
+                if (lockTaken)
+                {
+                    _sendLock.Release();
+                }
+            }
+        }
+
+        /// <summary>
+        /// 璇诲彇涓�琛屾秷鎭�傝繑鍥� null 琛ㄧず瀵圭宸插叧闂繛鎺ャ��
+        /// </summary>
+        internal async Task<string?> ReadMessageAsync()
+        {
+            if (_disposed)
+            {
+                return null;
+            }
+
+            string? line = await reader.ReadLineAsync().ConfigureAwait(false);
+            return line;
+        }
+
+        public void Dispose()
+        {
+            if (_disposed)
+            {
+                return;
+            }
+
+            _disposed = true;
+            try
+            {
+                reader.Dispose();
+            }
+            catch
+            {
+                // 蹇界暐鍏抽棴寮傚父
+            }
+
+            try
+            {
+                writer.Dispose();
+            }
+            catch
+            {
+                // 蹇界暐鍏抽棴寮傚父
+            }
+
+            try
+            {
+                _stream.Dispose();
+            }
+            catch
+            {
+                // 鍏抽棴杩囩▼涓殑寮傚父鍙互蹇界暐
+            }
+
+            _sendLock.Dispose();
+        }
+    }
+}

--
Gitblit v1.9.1