2011-12-08 25 views
5

名前付きパイプサーバーとそのサーバーに接続するクライアントを作成する少しの手順を記述しました。サーバーにデータを送信すると、サーバーはそれを正常に読み取ります。単一のNamed Pipeクライアントで読み書きできますか?

私がする必要があるのは、サーバーからメッセージを受信することです。そのため、生成され、受信データを待っている別のスレッドがあります。

問題は、スレッドが着信データを待っている間に、パイプが今すぐデータのチェックに縛られていると仮定すると、サーバーがメッセージをWriteLineコールでハングすると、メッセージを送信できなくなることです。

これは私が正しくこれに近づいていないということですか?または、このように使用されることを意図した名前のパイプはありませんか?パイプの方向をInOut、またはその両方として指定することはできますが、名前付きパイプで見た例は一方向にしか見えません。クライアントが送信し、サーバーが受信します。

ご意見、ご指摘、ご感想ありがとうございます。

相続人はこれまでのコード:

// Variable declarations 
NamedPipeClientStream pipeClient; 
StreamWriter swClient; 
Thread messageReadThread; 
bool listeningStopRequested = false; 

// Client connect 
public void Connect(string pipeName, string serverName = ".") 
{ 
    if (pipeClient == null) 
    { 
     pipeClient = new NamedPipeClientStream(serverName, pipeName, PipeDirection.InOut); 
     pipeClient.Connect(); 
     swClient = new StreamWriter(pipeClient); 
     swClient.AutoFlush = true; 
    } 

    StartServerThread(); 
} 

// Client send message 
public void SendMessage(string msg) 
{ 
    if (swClient != null && pipeClient != null && pipeClient.IsConnected) 
    { 
     swClient.WriteLine(msg); 
     BeginListening(); 
    } 
} 


// Client wait for incoming data 
public void StartServerThread() 
{ 
    listeningStopRequested = false; 
    messageReadThread = new Thread(new ThreadStart(BeginListening)); 
    messageReadThread.IsBackground = true; 
    messageReadThread.Start(); 
} 

public void BeginListening() 
{ 
    string currentAction = "waiting for incoming messages"; 

    try 
    { 
     using (StreamReader sr = new StreamReader(pipeClient)) 
     { 
      while (!listeningStopRequested && pipeClient.IsConnected) 
      { 
       string line; 
       while ((line = sr.ReadLine()) != null) 
       { 
        RaiseNewMessageEvent(line); 
        LogInfo("Message received: {0}", line); 
       } 
      } 
     } 

     LogInfo("Client disconnected"); 

     RaiseDisconnectedEvent("Manual disconnection"); 
    } 
    // Catch the IOException that is raised if the pipe is 
    // broken or disconnected. 
    catch (IOException e) 
    { 
     string error = "Connection terminated unexpectedly: " + e.Message; 
     LogError(currentAction, error); 
     RaiseDisconnectedEvent(error); 
    } 
} 
+0

もちろん、非同期が必要でない限り可能です。それはTRUE INDEPENDENCEですが、読書用に2本のパイプを使用することは、慎重に行われることを意図していますが、名前を付けることにします。 –

+1

少し謎めいですね。だから、読書用のパイプと、いつでも1つのアクションのために使うことができるように書くためのパイプがあるべきだと言っていると思いますか?もしそうなら、それは理にかなっている – w69rdy

答えて

1

あなたは一つのスレッドから読み取られ、同じパイプオブジェクトに別のスレッドに書き込むことはできません。ですから、送信するデータによってリスニングポジションが変わるプロトコルを作成することはできますが、同時に両方を行うことはできません。これを行うには、両側にクライアントとサーバーのパイプが必要です。

関連する問題