Socket Inputstream在流结束时不返回-1

时间:2012-11-08 11:21:04

标签: java sockets inputstream serversocket bytearrayoutputstream

这是发生问题的代码段:

public static byte[] copyLargeExt(InputStream input) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024*8];
        int n = 0;
        while(-1 != (n = input.read(buffer))) {
            baos.write(buffer, 0, n);
        // i just append this pattern ({###END###}) to force the break  
           /*if(baos.toString(UTF8.name()).endsWith("{###END###}")) {
                break;
            }*/
        }
        return baos.toByteArray();
    }

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

问题中的代码读取到套接字流的末尾。如果该方法是阻塞的并且在读取调用中,那么这只能意味着另一端尚未关闭其相应的输出流。

您有两种选择:

  • 更改另一端以关闭其输出流,以便此代码可以看到EOF。

  • 更改“协议”,以便此代码知道要预期的数据字节数...并准确读取该字节数。

答案 1 :(得分:0)

在Java中 如果服务器仅Socket.close()没有OutputStream.close(),则客户InputStream.read()将不会返回-1。 相反,客户端的InputStream.read()将阻塞直到超时。 所以Server上的最佳实践是:

OutputStream.close();
InputStream.close();
Socket.close();