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。但根据你的问题,你只会在发送程序关闭时看到这种行为,这意味着:

  1. available 方法正确地 returns 流中缓冲的字节数,所以这就是您接收数据的原因。即使您使用接收数据的速度比发送端发送的速度快(因此 available 中可能会出现一些零),您也只是 continue 而永远不会处理这种情况,这会在将来产生其他循环来捕获(最终)收到非零长度数据。
  2. 一旦关闭发送端,就会有一个点,之后它总是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.