这是发生问题的代码段:
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();
}
有人可以帮助我吗?
答案 0 :(得分:2)
问题中的代码读取到套接字流的末尾。如果该方法是阻塞的并且在读取调用中,那么这只能意味着另一端尚未关闭其相应的输出流。
您有两种选择:
更改另一端以关闭其输出流,以便此代码可以看到EOF。
更改“协议”,以便此代码知道要预期的数据字节数...并准确读取该字节数。
答案 1 :(得分:0)
在Java中
如果服务器仅Socket.close()
没有OutputStream.close()
,则客户InputStream.read()
将不会返回-1
。
相反,客户端的InputStream.read()
将阻塞直到超时。
所以Server上的最佳实践是:
OutputStream.close();
InputStream.close();
Socket.close();