2011-12-08 13 views
5

Adlandırılmış bir boru sunucusu ve ona bağlanan bir istemci oluşturan küçük bir başvuru yazdım. Verileri sunucuya gönderebilir ve sunucu başarıyla okuyabilir.Tek bir Adlandırılmış Boru istemcisi okuyabilir ve yazabilir misiniz?

Yapmam gereken bir sonraki şey, sunucudan ileti almaktır, bu yüzden gelen veriyi ortaya çıkarıp bekler ve bekler.

Sorun, iş parçacığı gelen verileri beklerken oturdu iken, artık veri denetlemek için bağlanmış olduğunu varsayarak, sunucuya WriteLine çağrıda asılı olarak iletileri gönderemezsiniz.

Sadece bu doğru bir şekilde yaklaşmıyorum mu? Yoksa böyle kullanılmayacak şekilde adlandırılmış borular mı? Bir borunun yönünü In, Out veya her ikisini de belirtebilmenize rağmen, adlandırılmış yöneltmelerde gördüğüm örnekler yalnızca bir yoldan gitmektedir, bir istemci gönderir ve bir sunucu alır.

Herhangi bir yardım, işaretçi veya öneri takdir edilecektir!

İşte şimdiye kadar kod:

// 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

Elbette, async'e ihtiyacınız olmadığı sürece bu mümkündür. Bu, DOĞRUDAN BAĞIMSIZ, okuma ve yazma için 2 borunun kullanımının BAĞIMLILIKTA GERÇEKTİR. –

+1

Kulağa biraz şifreli geliyor ... Bu yüzden, okumak için bir boru ve başka bir pipo olması gerektiğini söylüyorsunuz, çünkü her seferinde sadece bir eylem için kullanabilirsiniz. Eğer öyleyse, bu mantıklı – w69rdy

cevap

1

tek bir iş parçacığı okuma ve aynı boru nesneye başka iş parçacığı üzerinde yazamam. Böylece, dinleme konumunun gönderdiğiniz verilere bağlı olarak değiştiği bir protokol oluşturabilirken, her ikisini de aynı anda yapamazsınız. Bunu yapmak için iki tarafa bir istemci ve sunucu borusuna ihtiyacınız olacak.

İlgili konular