두 개의 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, 이미지); 디버그 모드에서.
누구든지이 문제를 피하는 방법에 대한 제안 사항이 있습니까?
나는 문제가 무엇인지 내 머리 꼭대기에서 알지 못한다. 그리고 디버깅 할 수있는 예제를 제공하지 않았기 때문에 실제로 조사 할 방법이 없습니다. 그러나 나는 스트림에서 읽기를 시도하기 전에 서버에서 WaitForConnection()을 호출 한 명명 된 파이프의 또 다른 SO 예제를 발견했습니다. 여기에 추가 할 수도 있습니다. 또한 StreamReader 및 StreamWriter 객체를 제거해야합니다. 당신은 그것들을 사용하지 않고 있으며, 그것들을 기본 스트림과의 직접 읽기/쓰기와 혼합하려고 시도하는 것은 나쁜 생각 일 것입니다. –
연결을 끊기 전에 WaitForPipeDrain()을 추가하십시오. –
답장을 보내 주셔서 대단히 감사합니다. 사실, 방금 서버 쪽에서 WaitForConnection()을 잊어 버렸습니다. –