[named pipe] .Net 的 named pipe,堪用的第一步。
NamedPipeServerStream 這個類別從 .Net 3.5 開始提供。使用者可以 io stream 的概念來操作資料的傳送。與它相對應的是 NamedPipeClientStream。由這兩個類別可以完成 named pipe 的範例。
在 msdn 的範例中,NamedPipeServerStream 是首先被啟用,以等待另一端來連接。程式宣告了一個 NamedPipeServerStream,名字叫 testpipe,pipe 的方向是 out。接下來便是等待對方來連接。這時,才是 NamedPipeClientStream 要來連接的時機。在 Client 連接之後,Server 只是寫一行字就準備關掉了。而 Client 也是讀一行字就準備關掉了。這樣的情境(Sceanrio),可以示範,但在實務上是不能用的。目前教育大概也是這樣吧,學校以為把東西教了,學生就可以用來工作了,學生也以為是這樣,公司也以為是這樣。結果,就整件事來說,這只是半套,另外半套得要有人教。但是全部的人都以為學生學了全套,到了公司發現不對,就怪學生或是學校,這情況就是亂象。雖然另外半套簡單到死,公司再不願意教的,就剩補習班要教了。雖然大家嫌補習班,證照班教的太基本、太無聊、太簡單。啊~套一句我最新的名言:「你不會的那一點,就是重點」。我離題了就此打住,希望有教學生的人可以幫幫學生們,不要被大題目嚇傻了,不要被大老闆嚇傻了。台灣的年輕人能力不輸人的。
接下來我這裡嘗試比較一般會使用的情境,會有幾個要求:
- Server 端要能等待連線,在 client 斷掉後回到等待下一次連線。
- Server 端要能傳送資料,也要能接收資料。Client 也是。
- 使用 GUI (也就是 windows form 程式)顯示接收到的訊息,以及輸入要傳送的訊息。
因為以上的要求,程式就變得複雜一點:
- 因為 .WaitForConnection 呼叫後會 block 住,等到 client 連接才回來,為避免 GUI 卡主,因此選擇用 thread 來處理。
- 同 1 的理由,不論 Server 或 Client 的 ReadLine 也會 block 住,也選擇用 thread 來處理。
- 為了第二點,Server 端及 Client 端中間,開兩個 pipe,一個 in,一個 out。
你會發現,不過多了三個要求,程式碼多了一大堆!例如,什麼叫做 client斷掉,怎麼判斷?MSDN 的範例中沒看到。收兩行以上的程式怎麼寫?MSDN 的範例中沒看到。多看別人寫的程式碼,尤其是 open source 的專案,是學寫程式的好範本!這讓我覺得以前的電腦書比較好,會一步步教,很仔細。但現在基礎的書大多跳掉細節只講觀念,反而又無法做出一個完整的東西。奇怪這一篇很常在抱怨哩…。
好,那先介紹 GUI 畫面,下次再看程式碼吧…。
正常的操作情境(Scenario)是:
- Server 程式啟動,Label1 位置會是紅字底的文字 Disconnected 說明程式是 Disconnected 狀態。
- 在 Server 畫面的 Open 右方的文字框,輸入 Pipe Name。
- 按下 Open 鈕後,Label1 位置會是黃字底的文字 Waiting 。
- Client 程式啟動,Label1 位置會是紅字底的文字 Disconnected
- 在 Client 畫面的 Open 右方的文字框,輸入 Pipe Name。
- 按下 Open 鈕後,兩隻程式的 Label1 位置會是綠字底的文字 Connected
- 接下來就可以在畫面最下方的方塊輸入文字,按下 Send 鈕,另一方就會收到文字了。
- 按下 Client 畫面的 Close 鈕,Client 程式會變成 Disconnected 狀態。而 Server 程式會變成 Waiting 狀態。Client 程式關掉。
- 按下 Server 畫面的 Close 鈕,Server 程式會變成 Disconnected 狀態。Server 程式關掉。