今天在使用socket编程时,想把从客户端获取的数据转换成String对象。使用了代码
// 将流对象转成String对象
String data = org.apache.commons.io.IOUtils.toString(socket.getInputStream());
发现执行代码时阻塞在这里了。难道是工具类Bug?追踪了一下代码发现执行到
// 执行代码input.read(buffer) 发生阻塞
while (EOF != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}百度了一下最终发现了问题导致原因:
read方法执行时如果遇到文件末尾会返回-1。而socket通信时,服务端会一直等待客户端输入。
所以默认情况下客户端发送完了数据之后是不会通知服务端数据发送完毕。
当我们在编写客户端代码时,需要手动调用socket对象的shutdownOutput()方法。来通知服务端数据发送完毕。
该方法的目的是告诉服务端客户端的输入结束了。但是并不关闭服务端与客户端的通信连接。
1万+

被折叠的 条评论
为什么被折叠?



