最近在做一個應用程式,涉及到兩個應用程式之間的通訊,就想到了用C#的具名管道的方式來實現,經過一番小折騰,總算實現了,現把一些主體的代碼粘貼出來與大家分享:
管道通訊會涉及到client端和Server端,Client端的主要代碼:
需要引用命名空間:using System.IO.Pipes;
Thread pipeThread = new Thread(new ThreadStart(SendData));pipeThread.IsBackground = true;pipeThread.Start();private void SendData(){try{_pipeClient = new NamedPipeClientStream(".","closePipe", PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.Impersonation);_pipeClient.Connect();StreamWriter sw = new StreamWriter(_pipeClient);sw.WriteLine("Exit");sw.Flush();Thread.Sleep(1000);sw.Close();}catch (Exception ex){Log.WriteLog(ex.Message);}}
Sever端的代碼:
Thread receiveDataThread = new Thread(new ThreadStart(ReceiveDataFromClient));receiveDataThread.IsBackground = true;receiveDataThread.Start();private void ReceiveDataFromClient(){while (true){try{_pipeServer = new NamedPipeServerStream("closePipe", PipeDirection.InOut, 2);_pipeServer.WaitForConnection(); //WaitingStreamReader sr = new StreamReader(_pipeServer);string recData = sr.ReadLine();if (recData == "Exit"){Log.WriteLog("Pipe Exit.", _logFile);ExitApplication();}Thread.Sleep(1000);sr.Close();}catch (Exception ex){Log.WriteLog(ex.Message, _logFile);}}}
這個例子只是Client與Sever端串連之後,給server端發訊息,使其關閉的簡易功能,也可以進行訊息的回傳。
這裡需要注意的是,開啟管道監聽和管道串連最好是線上程中處理,否則主程式會卡死(No Responding)。
還有就是線程要設定為後台線程,否則程式退出後,在工作管理員中還會存在,不能完全退出。
管道介紹:
管道是一段被進程用來通訊的共用記憶體。建立pipe的進程稱為服務端,串連到一個管道的進程叫做用戶端。一個進程向管道中寫入資訊,接著另外一個進程讀出其中資料。
關於管道有命名和匿名兩種管道,相比之下匿名管道所需開銷較小。這裡用管道這個名詞表明它是一個資訊通道,概念上來說,一個管道串連兩端。單向管道允許一端寫另一段讀,雙向管道允許一個進程既可以讀又可以向管道寫資料。
1. 匿名管道:
匿名管道是個沒有名字的單向管道,用來在父進程和子進程間傳輸資料。匿名管道總是在本機使用的,不可以用在網路上進行通訊。winodws NT/2000 以後的系統:匿名管道通過使用唯一名字的具名管道來實現。因此,你可以將匿名管道的控制代碼作為參數傳遞給需要具名管道控制代碼的函數。
2. 具名管道:
具名管道是一個有名字,單向或者雙向的,用在服務端和一個或多個用戶端進行通訊。一個具名管道的所有執行個體共用同樣的管道名,但是每個執行個體都有各自的緩衝和控制代碼,作為一個隔離的通道,讓用戶端-伺服器端進行通訊,這些執行個體允許用戶端同時使用相同名字的管道。
任何進程可以訪問具名管道,需要進行安全檢查,使得管道為相關或者不相關進程通訊提供了一種簡單的方式。具名管道可以用在同一台電腦或者網路電腦之間的進程間通訊。任何進程既可以作為服務端又可作為用戶端,使得段對段通訊成為可能。這裡服務端的意思是建立了一個具名管道的進程,用戶端是串連到具名管道執行個體的進程。
更多例子請參考:http://msdn.microsoft.com/zh-cn/library/bb546085(v=vs.90)