java – Socket输入流挂在最后读取.最好的办法呢?
发布时间:2020-12-14 05:06:46 所属栏目:Java 来源:网络整理
导读:我有点沉迷于如何避免我的插座挂在阅读.这是我的代码: Socket socket = new Socket("someMachine",16003); OutputStream outputStream = socket.getOutputStream(); InputStream inputStream = socket.getInputStream(); try { outputStream.write(messageB
我有点沉迷于如何避免我的插座挂在阅读.这是我的代码:
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),我该如何解决这个问题(即停止读取时挂起). 任何帮助赞赏! 解决方法
只要停止读取会挂起的问题是这可能发生在2种情况:
1:服务器没有任何更多的数据要发送 2:服务器已发送更多数据,但由于网络过载,您的客户端尚未收到. 而您只想在第一种情况下真正停止阅读,但是您希望在第二种情况下读取阻止. 解决这个问题的方法是制定一个传输协议(Standard),允许服务器告诉客户它期望发送多少数据. 如果服务器提前知道总数据大小,只需通过发送传输中的总字节数开始,然后发送数据.客户端知道何时收到所有数据. (或者服务器可以在完成后简单地关闭连接,这样读取失败,但只有在以后不需要连接的情况下才可以) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容