通過創建 NamedPipeServerStream 的一個新實例,來創建服務器。NamedPipeServerStream 派生自基類 PipeStream,PipeStream 派生自 Stream 基類,因此可以使用流的所有功能,例如,可以創建CryptoStream 或 GZipStream,把加密或壓縮的數據寫入命名管道。構造函數需要管道的名稱,通過管道通信的多個進程可以使用該管道。
用于下面代碼片段的第二個參數定義了管道的方向。服務器流用于讀取,因此將方向設置為 PipeDirection.In。命名管道也可以是雙向的,用于讀寫,此時使用PipeDirection.InOut。匿名管道只能是單向的。接下來,調用WaitForConnection()方法,命名管道等待寫入方的連接。然后,在一個循環中(直到收到消息“bve”),管道服務器把消息讀入緩沖區數組,把消息寫到控制臺:
private static void PipesReader(string pipeName)
{try{using (var pipeReader =new NamedPipeServerStream(pipeName, PipeDirection.In)){pipeReader.WaitForConnection();Console.WriteLine ("reader connected"); const int BUFFERSIZE = 256; bool completed = false; while (!completed){byte[] buffer = new byte[BUFFERSIZE];int nRead = pipeReader.Read(buffer, 0, BUFFERSIZE);string line = Encoding.UTF8.GetString(buffer, 0, nRead); Console.WriteLine(line);if (line == "bye") completed = true;}}Console.WriteLine("completed?reading");?Console.ReadLine();}catch (Exception ex){Console.WriteLine(ex.Message);}}
}
以下是可以用命名管道配置的其他一些選項:
●? 可以把枚舉 PipeTransmissionMode 設置為 Byte 或 Message。設置為Byte,就發送一個連續的流,設置為 Message,就可以檢索每條消息。
●? 使用管道選項,可以指定 WriteThrough 立即寫入管道,而不緩存。
●? 可以為輸入和輸出配置緩沖區大小。
●? 配置管道安全性,指定誰允許讀寫管道。
●? 可以配置管道句柄的可繼承性,這對與子進程進行通信是很重要的。
因為 NamedPipeServerStream 是一個流,所以可以使用 StreamReader,而不是讀取字節數組,該方法簡化了代碼:
var?pipeReader?=?new?NamedPipeServerStream(pipeName, PipeDirection.In);?
using?(var?reader?=?new?StreamReader(pipeReader))
{pipeReader.WaitForConnection();Console.WriteLine("reader?connected");?bool?completed?=?false;?while (!completed){string line = reader.ReadLine(); Console.WriteLine(line);if (line == "bye") completed = true; }
}