2009-05-21 43 views
16

Tôi có hai ứng dụng .NET nói chuyện với nhau qua một đường ống có tên. Mọi thứ đều tuyệt vời lần đầu tiên thông qua, nhưng sau khi tin nhắn đầu tiên được gửi đi, và máy chủ sẽ nghe lại, phương pháp WaitForConnection() ném một số System.IO.Exception với thông báo Ống bị hỏng.
Tại sao tôi nhận được ngoại lệ này ở đây? Đây là lần đầu tiên tôi làm việc với các đường ống, nhưng một mô hình tương tự đã làm việc cho tôi trong quá khứ với các ổ cắm.System.IO.Exception: Ống bị hỏng

Mã ahoy!
Server:

using System.IO.Pipes; 

static void main() 
{ 
    var pipe = new NamedPipeServerStream("pipename", PipeDirection.In); 
    while (true) 
    { 
     pipe.Listen(); 
     string str = new StreamReader(pipe).ReadToEnd(); 
     Console.Write("{0}", str); 
    } 
} 

Chủ đầu tư:

public void sendDownPipe(string str) 
{ 
    using (var pipe = new NamedPipeClientStream(".", "pipename", PipeDirection.Out)) 
    { 
     using (var stream = new StreamWriter(pipe)) 
     { 
      stream.Write(str); 
     } 
    } 
} 

Cuộc gọi đầu tiên sendDownPipe được máy chủ để in các thông điệp mà tôi gửi chỉ là tốt, nhưng khi nó lặp lại lên đến lắng nghe một lần nữa, nó poops.

+0

Tôi nghĩ lý do bạn đang gặp vấn đề này là do dòng "mới StreamReader (ống) ". Phạm vi của trình đọc luồng được tạo là vòng lặp đầu tiên và sau đó được tạo lại. Tuy nhiên, hành vi của trình đọc luồng là đóng luồng mà chúng đang gói - vì vậy khi nó nằm ngoài phạm vi, nó sẽ đóng luồng luồng. Bạn có thể thử di chuyển tuyên bố của nó ra khỏi vòng lặp while và kiểm tra (P.S: Tôi không đích thân thử nếu mã hoạt động nếu bạn làm như vậy - chỉ muốn thêm một bình luận thay vì trả lời) – user3141326

Trả lời

16

Tôi sẽ đăng mã của mình dường như hoạt động - tôi đã tò mò vì tôi chưa bao giờ làm bất cứ điều gì với đường ống. Tôi không tìm thấy lớp bạn đặt tên cho phía máy chủ trong không gian tên có liên quan, vì vậy, đây là mã dựa trên NamedPipeServerStream. Các công cụ gọi lại chỉ là vì tôi không thể bị làm phiền với hai dự án.

NamedPipeServerStream s = new NamedPipeServerStream("p", PipeDirection.In); 
Action<NamedPipeServerStream> a = callBack; 
a.BeginInvoke(s, ar => { }, null); 
... 
private void callBack(NamedPipeServerStream pipe) 
{ 
    while (true) 
    { 
    pipe.WaitForConnection(); 
    StreamReader sr = new StreamReader(pipe); 
    Console.WriteLine(sr.ReadToEnd()); 
    pipe.Disconnect(); 
    } 
} 

Và khách hàng thực hiện điều này:

using (var pipe = new NamedPipeClientStream(".", "p", PipeDirection.Out)) 
using (var stream = new StreamWriter(pipe)) 
{ 
    pipe.Connect(); 
    stream.Write("Hello"); 
} 

tôi có thể lặp lại trên khối nhiều lần với các máy chủ đang chạy, không có Prob.

+0

Điều đó đã làm các trick. Tôi đoán theres không có ngắt kết nối tiềm ẩn khi một khách hàng rơi ra khỏi đầu kia. Cảm ơn. –

+0

Điều đó cũng giúp tôi. Cảm ơn câu trả lời tuyệt vời! –

+1

Điều này cho tôi một lỗi rằng đường ống không được kết nối trên dòng này: 'using (var stream = new StreamWriter (pipe))' – eliah

5

Vấn đề đối với tôi đã xảy ra khi tôi gọi đường ống.WaitForConnection() từ máy chủ, sau khi máy khách ngắt kết nối. Giải pháp là để bắt IOException và gọi pipe.Disconnect(), và sau đó gọi pipe.WaitForConnection() một lần nữa:

while (true) 
{ 
    try 
    { 
     _pipeServer.WaitForConnection(); 
     break; 
    } 
    catch (IOException) 
    { 
     _pipeServer.Disconnect(); 
     continue; 
    }    
} 
Các vấn đề liên quan