2011-12-08 24 views
5

Tôi đã viết một cách đơn giản để tạo ra một máy chủ đường ống có tên và một khách hàng kết nối với nó. Bạn có thể gửi dữ liệu đến máy chủ và máy chủ đọc thành công.Bạn có thể đọc và viết với một khách hàng Ống có tên không?

Điều tiếp theo tôi cần làm là nhận tin nhắn từ máy chủ, vì vậy tôi có một luồng khác để sinh ra và ngồi và chờ dữ liệu đến.

Vấn đề là trong khi luồng đang chờ đợi dữ liệu đến, bạn không còn có thể gửi tin nhắn đến máy chủ khi nó bị treo trên cuộc gọi WriteLine như tôi cho rằng đường ống hiện được gắn kiểm tra dữ liệu.

Vì vậy, nó chỉ là tôi không tiếp cận điều này đúng cách? Hoặc được đặt tên ống không có nghĩa là để được sử dụng như thế này? Các ví dụ tôi đã nhìn thấy trên đường ống được đặt tên dường như chỉ đi một chiều, khách hàng gửi và máy chủ nhận được, mặc dù bạn có thể chỉ định hướng của một đường ống là In, Out hoặc cả hai.

Bất kỳ trợ giúp, con trỏ hoặc đề xuất nào sẽ được đánh giá cao!

Heres' mã cho đến nay:

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

Tất nhiên, điều đó có thể miễn là bạn không cần đồng bộ. Đó là TRUE INDEPENDENCE, trong khi bạn sử dụng 2 ống để đọc và viết có nghĩa là TRUELY IN DEPENDENCE, tôi cũng giả sử đặt tên cho chúng như vậy. –

+1

Âm thanh hơi khó hiểu .. Vì vậy, tôi nghĩ bạn đang nói rằng cần có một đường ống để đọc và một đường ống khác để viết vì bạn chỉ có thể sử dụng một cho một hành động bất kỳ lúc nào? Nếu có, điều đó có ý nghĩa – w69rdy

Trả lời

1

Bạn không thể đọc từ một thread và viết trên một thread để các đối tượng đường ống tương tự. Vì vậy, trong khi bạn có thể tạo một giao thức nơi vị trí nghe thay đổi tùy thuộc vào dữ liệu bạn đang gửi, bạn không thể thực hiện cả hai cùng một lúc. Bạn sẽ cần một ống máy khách và máy chủ ở cả hai bên để thực hiện việc này.

Các vấn đề liên quan