给定成功的Socket连接,我的Java服务器将执行以下操作:

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


这就是我的C#客户端所做的:

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


它会挂在ReadString()上并最终超时。如果您将其更改为

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


返回72,我认为它对应于H。因此,显然Java服务器确实在发送消息-为什么ReadString()挂起?

最佳答案

您写入然后读取的格式之间不匹配。 BinaryReader.ReadString的文档说:


  从当前流中读取一个字符串。该字符串以长度为前缀,一次编码为7位整数。


那和你写的很不一样。

我的猜测是ReadString的长度变得异常大,并试图读取那么多字节。当然,不会发送。

关于java - 为什么BinaryReader卡在ReadString()上而不卡在Read()上?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42733013/

10-08 21:53