2011-10-07 3 views
2

명명 된 파이프를 수행하는 방법을 배우려고합니다. 그래서 LinqPad에 서버와 클라이언트를 만들었습니다. 여기 명명 된 파이프 서버 및 클라이언트 - 아니요 메시지

var p = new NamedPipeServerStream("test3", PipeDirection.Out); 
p.WaitForConnection(); 
Console.WriteLine("Connected!"); 
new StreamWriter(p).WriteLine("Hello!"); 
p.Flush(); 
p.WaitForPipeDrain(); 
p.Close(); 

내 클라이언트입니다 : 여기

내 서버입니다 내가 다음 서버 및 클라이언트를 실행

var p = new NamedPipeClientStream(".", "test3", PipeDirection.In); 
p.Connect(); 
var s = new StreamReader(p).ReadLine(); 
Console.Write("Message: " + s); 
p.Close(); 

, 나는 페이지의 "연결!" 서버에 표시되어 제대로 연결됩니다. 그러나 클라이언트는 항상 뒤에 Message:을 표시하므로 실제로 데이터가 서버에서 클라이언트로 이동하여 표시되지 않습니다. 나는 이미 파이프 방향을 바꿔보고 클라이언트가 동일한 결과로 서버에 데이터를 보내도록했습니다.

이 예에서 화면에 데이터가 인쇄되지 않는 이유는 무엇입니까? 내가 뭘 놓치고 있니?

감사합니다. 다음과 같이

+0

StreamReader.ReadLine 문서에 따르면 스트림 끝 부분에 도달하면 null을 반환합니다. ReadLine을 할 때 파이프에 데이터가없고 스트림이 비어있을 수 있습니다. 다시 돌아가서 s가 null 인 경우 다시 읽으려고 할 수 있습니다. – user957902

답변

2
는 서버 코드를 변경

:

StreamWriter wr = new StreamWriter(p); 
wr.WriteLine("Hello!\n"); 
wr.Flush(); 

당신의 캐릭터는 StreamWriter를

처럼 L.B, 당신은 StreamWriter를 플러시해야했다
+0

그래, 가장 높은 레벨에서 플러시해야합니다 (일반적으로 스트림의 모든 사용자를 먼저 닫지 않고 스트림을 닫아야합니다). 그러나 그때 나는 여분의'\ n'이 필요하다고 생각하지 않는다. –

+0

와후, 그게 다야! 대단히 감사합니다 !! – mellamokb

3

에 플러시하지 않습니다. 그러나 using 패턴을 채용하면 이러한 실수를 방지 할 수 :

using (var p = new NamedPipeServerStream("test3", PipeDirection.Out)) 
{ 
    p.WaitForConnection(); 
    Console.WriteLine("Connected!"); 
    using (var writer = new StreamWriter(p)) 
    { 
     writer.WriteLine("Hello!"); 
     writer.Flush(); 
    } 
    p.WaitForPipeDrain(); 
    p.Close(); 
} 

을 위의 코드에서, 의도 한대로 (이 작업은 또한 개체가 배치 될 때 수행되기 때문) Flush()Close() 생략 하였다는 모든 작동 할지라도. 또한 예외가 발생하면 모든 것이 올바르게 정리됩니다.

관련 문제