2013年9月15日 星期日

[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),可以示範,但在實務上是不能用的。目前教育大概也是這樣吧,學校以為把東西教了,學生就可以用來工作了,學生也以為是這樣,公司也以為是這樣。結果,就整件事來說,這只是半套,另外半套得要有人教。但是全部的人都以為學生學了全套,到了公司發現不對,就怪學生或是學校,這情況就是亂象。雖然另外半套簡單到死,公司再不願意教的,就剩補習班要教了。雖然大家嫌補習班,證照班教的太基本、太無聊、太簡單。啊~套一句我最新的名言:「你不會的那一點,就是重點」。我離題了就此打住,希望有教學生的人可以幫幫學生們,不要被大題目嚇傻了,不要被大老闆嚇傻了。台灣的年輕人能力不輸人的。

接下來我這裡嘗試比較一般會使用的情境,會有幾個要求:

  1. Server 端要能等待連線,在 client 斷掉後回到等待下一次連線。
  2. Server 端要能傳送資料,也要能接收資料。Client 也是。
  3. 使用 GUI (也就是 windows form 程式)顯示接收到的訊息,以及輸入要傳送的訊息。

因為以上的要求,程式就變得複雜一點:

  1. 因為 .WaitForConnection 呼叫後會 block 住,等到 client 連接才回來,為避免 GUI 卡主,因此選擇用 thread 來處理。
  2. 同 1 的理由,不論 Server 或 Client 的 ReadLine 也會 block 住,也選擇用 thread 來處理。
  3. 為了第二點,Server 端及 Client 端中間,開兩個 pipe,一個 in,一個 out。

你會發現,不過多了三個要求,程式碼多了一大堆!例如,什麼叫做 client斷掉,怎麼判斷?MSDN 的範例中沒看到。收兩行以上的程式怎麼寫?MSDN 的範例中沒看到。多看別人寫的程式碼,尤其是 open source 的專案,是學寫程式的好範本!這讓我覺得以前的電腦書比較好,會一步步教,很仔細。但現在基礎的書大多跳掉細節只講觀念,反而又無法做出一個完整的東西。奇怪這一篇很常在抱怨哩…。

好,那先介紹 GUI 畫面,下次再看程式碼吧…。

image image

正常的操作情境(Scenario)是:

  1. Server 程式啟動,Label1 位置會是紅字底的文字 Disconnected image 說明程式是 Disconnected 狀態。
  2. 在 Server 畫面的 Open 右方的文字框,輸入 Pipe Name。
  3. 按下 Open 鈕後,Label1 位置會是黃字底的文字 Waiting image
  4. Client 程式啟動,Label1 位置會是紅字底的文字 Disconnected image
  5. 在 Client 畫面的 Open 右方的文字框,輸入 Pipe Name。
  6. 按下 Open 鈕後,兩隻程式的 Label1 位置會是綠字底的文字 Connected image
  7. 接下來就可以在畫面最下方的方塊輸入文字,按下 Send 鈕,另一方就會收到文字了。
  8. 按下 Client 畫面的 Close 鈕,Client 程式會變成 Disconnected 狀態。而 Server 程式會變成 Waiting 狀態。Client 程式關掉。
  9. 按下 Server 畫面的 Close 鈕,Server 程式會變成 Disconnected 狀態。Server 程式關掉。

沒有留言:

張貼留言