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