2017-03-11 2 views
0

Socket Verbindung erfolgreich gegeben, mein Java Server tut dies:Warum hängt BinaryReader an ReadString(), aber nicht an Read()?

out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
out.write("HELLO"); 
out.newLine(); 
out.flush(); 

Und das ist, was mein C# Client tut:

TcpClient tcpClient   = new TcpClient("localhost", port); 
tcpClient.ReceiveTimeout = 10000; 
NetworkStream networkStream = tcpClient.GetStream(); 
BinaryReader reader = new BinaryReader(networkStream); 
reader.ReadString(); // <--- Hangs 
tcpClient.Close(); 

Es auf ReadString() und Auszeit schließlich hängen. Wenn Sie es

reader.Read(); // <--- Returns 72 

Returns ändern 72 was ich davon ausgehen, entspricht dem H. Offensichtlich sendet der Java-Server tatsächlich die Nachricht - warum hängt ReadString()?

+0

siehe http://stackoverflow.com/a/8613300/3343533 –

+0

@MitatKoyuncu - Das funktioniert nur, wenn die Java-Seite den Stream nach dem Schreiben '' HALLO \ n "' schließt. (Denk darüber nach.) –

Antwort

2

Sie haben eine Diskrepanz zwischen dem Format, das Sie schreiben und anschließend lesen. Die Dokumentation für BinaryReader.ReadString sagen:

Liest eine Zeichenfolge aus dem aktuellen Stream. Der Zeichenfolge wird die Länge vorangestellt, die als ganze Zahl mit jeweils sieben Bits kodiert wird.

Das ist sehr unterschiedlich zu dem, was Sie schreiben.

Meine Schätzung ist, dass ReadString eine unsinnig große "Länge" bekommt, und versucht, so viele Bytes zu lesen. Natürlich werden sie nicht gesendet werden.