InputStream 永远不会得到 EOF
InputStream never gets EOF
首先,请允许我向您展示我的客户端代码:
String command;
socket.setSoTimeout(5000);
while(true) {
try {
final byte[] targetArray = new byte[is.available()];
final int x = is.read(targetArray);
if (x == -1) {
System.out.println("end");
break;
}
if (x == 0) continue;
command = new String(targetArray);
handleCommand(command).start();
}catch (Exception e){
e.printStackTrace();
}
}
一旦连接到实际的套接字,客户端就会发送一些身份验证数据,但不会收到任何数据,现在,它等待从服务器接收数据,当它收到时,它会很好地处理它等等,除了,当我停止服务器(字面意思是关闭程序)时,没有任何反应,而实际上,我希望它发送 EOF (-1)。相反,它只是始终如一地发送垃圾邮件。
根据available
method's documentation(强调我的):
Returns an estimate of the number of bytes that can be read ...
和
It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream ...
所以根据您发布的最少代码,您不应该使用 available
来分配缓冲区,因为它可能总是 return 0
这反过来又使 read
操作总是 return 0
。但根据你的问题,你只会在发送程序关闭时看到这种行为,这意味着:
available
方法正确地 returns 流中缓冲的字节数,所以这就是您接收数据的原因。即使您使用接收数据的速度比发送端发送的速度快(因此 available
中可能会出现一些零),您也只是 continue
而永远不会处理这种情况,这会在将来产生其他循环来捕获(最终)收到非零长度数据。
- 一旦关闭发送端,就会有一个点,之后它总是return
0
,因为它没有数据。所以你分配零长度缓冲区,read
方法首先检查你的缓冲区是零长度,而不是 EOF。
因此请确保分配的缓冲区大小至少为 1
。
另外,根据Socket#getInputStream
method's documentation:
If there are no bytes buffered on the socket, and the socket has not been closed using close
, then available
will return 0.
首先,请允许我向您展示我的客户端代码:
String command;
socket.setSoTimeout(5000);
while(true) {
try {
final byte[] targetArray = new byte[is.available()];
final int x = is.read(targetArray);
if (x == -1) {
System.out.println("end");
break;
}
if (x == 0) continue;
command = new String(targetArray);
handleCommand(command).start();
}catch (Exception e){
e.printStackTrace();
}
}
一旦连接到实际的套接字,客户端就会发送一些身份验证数据,但不会收到任何数据,现在,它等待从服务器接收数据,当它收到时,它会很好地处理它等等,除了,当我停止服务器(字面意思是关闭程序)时,没有任何反应,而实际上,我希望它发送 EOF (-1)。相反,它只是始终如一地发送垃圾邮件。
根据available
method's documentation(强调我的):
Returns an estimate of the number of bytes that can be read ...
和
It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream ...
所以根据您发布的最少代码,您不应该使用 available
来分配缓冲区,因为它可能总是 return 0
这反过来又使 read
操作总是 return 0
。但根据你的问题,你只会在发送程序关闭时看到这种行为,这意味着:
available
方法正确地 returns 流中缓冲的字节数,所以这就是您接收数据的原因。即使您使用接收数据的速度比发送端发送的速度快(因此available
中可能会出现一些零),您也只是continue
而永远不会处理这种情况,这会在将来产生其他循环来捕获(最终)收到非零长度数据。- 一旦关闭发送端,就会有一个点,之后它总是return
0
,因为它没有数据。所以你分配零长度缓冲区,read
方法首先检查你的缓冲区是零长度,而不是 EOF。
因此请确保分配的缓冲区大小至少为 1
。
另外,根据Socket#getInputStream
method's documentation:
If there are no bytes buffered on the socket, and the socket has not been closed using
close
, thenavailable
will return 0.