命名管道 是 Windows 核心提供的高效進程間通訊 (IPC) 機制,支援本機與跨網路通訊。本文基於 CodeProject 開源封裝 (AppModule.NamedPipes),快速建立伺服器端主控台程式。
CodeProject: .NET Named Pipes Part 1 提供兩個組件:
AppModule.InterProcessComm:定義 IInterProcessConnection、ServerPipeConnection、ClientPipeConnection 介面與基類。AppModule.NamedPipes:具體 Named Pipe 實作 (P/Invoke CreateNamedPipe/ConnectNamedPipe 等)。
using System;
using System.Threading;
using AppModule.InterProcessComm;
using AppModule.NamedPipes;
namespace Server
{
class Program
{
static void Main(string[] args)
{
// 管道名稱、輸入/輸出緩衝區大小、逾時(ms)、非同步旗標
var server = new ServerPipeConnection("np-test-by-jinjazz", 512, 512, 5000, false);
Console.WriteLine("等待客戶端連線...");
while (true)
{
try
{
server.Disconnect(); // 斷開上一個客戶端
server.Connect(); // 等待新連線 (阻塞)
string request = server.Read();
if (!string.IsNullOrEmpty(request))
{
Console.WriteLine($"收到: {request}");
server.Write($"Echo: {request}");
if (request.ToLower() == "break") break;
}
}
catch (Exception ex)
{
Console.WriteLine($"錯誤: {ex.Message}");
break;
}
}
server.Dispose();
Console.WriteLine("按任意鍵結束...");
Console.ReadKey();
}
}
}
Connect() 阻塞直到客戶端呼叫 ClientPipeConnection.Connect()。Read() 封裝 ReadFile,Write() 封裝 WriteFile,均為同步阻塞。Disconnect() 對應 DisconnectNamedPipe,釋放當前實例準備下一輪。"break" 指令跳出迴圈,呼叫 Dispose() 關閉管道控制代碼。AppModule.InterProcessComm、AppModule.NamedPipes 兩個 DLL。Server 參考上述 DLL,貼上程式碼並執行。ClientPipeConnection 連線測試 (見下篇)。| 優點 | 缺點/限制 |
|---|---|
| 高效能、低延遲 (核心模式傳輸) | 僅限 Windows 平台 |
| 支援跨網路 (SMB/445 port) | 需開放防火牆、受網路延遲影響 |
| 內建同步機制 (Connect/Disconnect) | 單連線模式;高併發需自行實作連線池/多執行緒 |
| 可設定 ACL 存取控制 | 大訊息需自行分片 (緩衝區限制) |
.NET Core 3.0+ 內建 System.IO.Pipes.NamedPipeServerStream/ClientStream,新專案建議直接使用 BCL 實現,無需第三方組件。