如何解决套接字输入流在最终读取时挂起处理此问题的最佳方法?
仅停止读取挂起的位置的问题是,这可能在两种情况下发生:
1:服务器没有其他数据要发送
2:服务器已发送了更多数据,但由于网络过载,您的客户端尚未收到它。
在第一种情况下,您只想真正停止阅读,而在第二种情况下,您要阻止阅读。
解决此问题的方法是制定一个传输协议(标准),该协议允许服务器告知客户端它希望发送多少数据。
如果服务器预先知道总数据大小,则只需先发送传输中的字节总数,然后再发送数据即可。这样,客户端便知道何时接收到所有数据。
(或者服务器可以在完成后简单地关闭连接。这种方式read
应该会失败,但这仅在将来不需要连接时才有效)
解决方法
我对如何避免套接字在读取时挂起有些困惑。这是我的代码:
Socket socket = new Socket("someMachine",16003);
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
try {
outputStream.write(messageBuffer.toByteArray());
outputStream.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer response = new StringBuffer();
int result;
while ((result = in.read()) != -1) {
response.append(Character.toChars(result));
System.out.println(result);
}
System.out.println("Done!"); //never gets printed
} catch (...) {}
上面的代码成功地从流中读取了所有数据,但随后挂起。在网上阅读时,我期望从服务器接收到-1(我无法控制),以表明我已经到达流的末尾,但是我得到了:
(Lots of data above this point)
57
10
37
37
69
79
70
10
然后挂起。因此,我的问题是:
1)我是否将此编码错误或服务器的响应有问题?
2)如果服务器的响应有问题(即未返回-1),我该如何解决(即在挂起时停止读取)。
任何帮助表示赞赏!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。