具名管道的串連總結:
具名管道的串連有兩次阻塞的地方,一是在WaitForConnection()時[用戶端進行串連同理]會阻塞,二是在ReadString()[讀取管道資訊]時。
在伺服器端第一次建立具名管道後等待串連,當用戶端串連成功後伺服器端的具名管道就用作通訊用途。如果需要再次等待串連,伺服器端就需要再次開啟具名管道(建立一個具名管道的執行個體)並等待串連。
對於用戶端每次開啟具名管道後建立與伺服器間的串連,然後就可以利用具名管道進行通訊,如果需要建立第二個串連則需要再次開啟管道和再次建立串連。
建立具名管道時需要指定一個主機名稱和管道名,在同一主機上管道名稱是唯一的,一個具名管道一旦被建立就不允許相同名稱的管道再被建立。
請注意關閉管道和關閉串連是不同的意思,在同一個管道上可以依次反覆建立串連,而且可以減小系統的負荷。而且如果指定了管道最大數量限制那麼在開啟的管道達到最大限制後如果不關閉舊管道就無法開啟新管道。 對於客戶方則無法關閉串連,而只能直接調用Close()關閉管道。如果用戶端調用了close()關閉了管道,那麼再次串連伺服器端的原管道就不可以了,服務端的管道也需要重新進行初始化並且等待串連。
關於雙向通訊:
上篇文章中提到了管道可以進行雙向通訊,雙向通訊實際上就是服務端類比用戶端回傳訊息,用戶端進行接收的過程,主要是調用了pipeServer.RunAsClient(StartListening),StartListening是一個回調方法,裡面可以寫回傳的訊息。而用戶端就進行Read就可以了,具體代碼為:
用戶端主要代碼:
NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", _pipeName, PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.Impersonation);pipeClient.Connect();while (true){//Writestring sRequest = "request";StreamString ss = new StreamString(pipeClient);ss.WriteString(sRequest);//Readstring sResult = ss.ReadString();if (sResult != ""){//}}
服務端主要代碼:
NamedPipeServerStream pipeServer = new NamedPipeServerStream(_pipeName, PipeDirection.InOut, 1);pipeServer.WaitForConnection();try{_ss = new StreamString(pipeServer);string sResult = _ss.ReadString();if ( sResult != ""){pipeServer.RunAsClient(StartListening);}}catch (IOException ex){}private void StartListening(){//Return result messagestring sResult = "request";_ss.WriteString(sResult);}
因本人的程式包含一些複雜的邏輯處理,只是貼出來部分主幹代碼,代嗎不能直接運行,希望博友理解含義後自行實踐。