2014-10-21 6 views
0

두 개의 Windows 응용 프로그램이 있고 명명 된 파이프를 사용하여 두 개의 Windows 응용 프로그램간에 데이터 목록을 보내고받습니다. BinaryFormatter 클래스를 사용하는 직렬화/직렬화 메커니즘이 있습니다.System.IO.Exception : 파이프가 클라이언트 측에서 깨졌습니다.

서버 :

static void StartServer() 
    { 
     var server = new NamedPipeServerStream("PipesEnroll", PipeDirection.InOut); 

      while (true) 
      { 
       StreamReader reader = new StreamReader(server); 
       StreamWriter writer = new StreamWriter(server); 
       string terminalTemplate; 
       string matcherTemplate; 
       int mathVersionNumber = 9; 
       int numberFingers; 
       BinaryFormatter formatterDeserialize = new BinaryFormatter(); 
       List<byte[]> retrievedList = (List<byte[]>)formatterDeserialize.Deserialize(reader.BaseStream); 
       bool isOk = Enroll.EnrollWithoutWCF(retrievedList, mathVersionNumber, out terminalTemplate, out matcherTemplate, out numberFingers); 
       List<String> sendList = new List<string>(); 
       sendList.Add(isOk.ToString()); 
       sendList.Add(terminalTemplate); 
       sendList.Add(matcherTemplate); 
       sendList.Add(numberFingers.ToString()); 
       BinaryFormatter formatterSerialize = new BinaryFormatter(); 
       formatterSerialize.Serialize(writer.BaseStream, sendList); 
       server.Disconnect(); 
     } 

클라이언트 :

    using (var client = new NamedPipeClientStream(".", "PipesEnroll", PipeDirection.InOut)) 
         { 
          client.Connect(); 
          StreamReader reader = new StreamReader(client); 
          StreamWriter writer = new StreamWriter(client); 

           BinaryFormatter formatterSerialize = new BinaryFormatter(); 
           formatterSerialize.Serialize(writer.BaseStream, images); 
           // writer.Write(stream); 
           // writer.Flush(); 
           BinaryFormatter formatterDeserialize = new BinaryFormatter(); 
           List<String> retrievedList = (List<String>)formatterDeserialize.Deserialize(reader.BaseStream); 
           bool isOK = Convert.ToBoolean(retrievedList[0]); 
           string terminalTemplate = retrievedList[1]; 
           string matcherTemplate = retrievedList[2]; 
           int numberFingers = Convert.ToInt32(retrievedList[3]); 

}

그러나 예외는 "System.IO.Exception : 파이프가 파손은"formatterSerialize.Serialize을 (실행시 클라이언트에 나타납니다 writer.BaseStream, 이미지); 디버그 모드에서.

누구든지이 문제를 피하는 방법에 대한 제안 사항이 있습니까?

+0

나는 문제가 무엇인지 내 머리 꼭대기에서 알지 못한다. 그리고 디버깅 할 수있는 예제를 제공하지 않았기 때문에 실제로 조사 할 방법이 없습니다. 그러나 나는 스트림에서 읽기를 시도하기 전에 서버에서 WaitForConnection()을 호출 한 명명 된 파이프의 또 다른 SO 예제를 발견했습니다. 여기에 추가 할 수도 있습니다. 또한 StreamReader 및 StreamWriter 객체를 제거해야합니다. 당신은 그것들을 사용하지 않고 있으며, 그것들을 기본 스트림과의 직접 읽기/쓰기와 혼합하려고 시도하는 것은 나쁜 생각 일 것입니다. –

+1

연결을 끊기 전에 WaitForPipeDrain()을 추가하십시오. –

+0

답장을 보내 주셔서 대단히 감사합니다. 사실, 방금 서버 쪽에서 WaitForConnection()을 잊어 버렸습니다. –

답변

1

StreamWriter는 NamedPipeClientStream에 속합니다. NamedPipeClientStream이 처리의 일부로 처리되면 StreamWriter도 삭제됩니다. 어떤 이유로 든 StreamWriter가 코드의 다른 부분에서 Closed/Disposed이면 결과가 파이프가됩니다.

1) FormatterSerialize.Serialize가 StreamWriter를 닫지 않는지 확인하십시오.

2) NamedPipeClientStream의 사용을 종료하기 전에 StreamWriter를 플러시해야합니다.

+1

아직 답변이없는 이전 질문에 답하기 전에 의견을 확인하여 문제의 해결 방법이 언급되어 있고 그 동안 문제가 해결되었는지 확인해야합니다. – hotzst

+2

나는 동의하지 않는다. 두 가지 제안이 모두 훌륭하고 궁극적으로, 가정은 정확했습니다. 이것은 간결하고 완전한 대답을 이뤄내지 않습니다. 게다가 답은 처음에는 코멘트에 포함되지 않습니다. – jinzai