为什么BinaryReader挂在ReadString()上但不挂在Read()上?

时间:2017-03-11 08:20:57

标签: java c# sockets

鉴于连接成功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()挂起?

1 个答案:

答案 0 :(得分:2)

您编写的格式与随后读取的格式不匹配。 BinaryReader.ReadString的文档说:

  

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

这与你所写的内容截然不同。

我的猜测是ReadString得到一个无意义的大&#34;长度&#34;,并试图读取那么多字节。当然,他们不会被送去。