java – Socket输入流挂在最后读取.最好的办法呢?

前端之家收集整理的这篇文章主要介绍了java – Socket输入流挂在最后读取.最好的办法呢?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有点沉迷于如何避免我的插座挂在阅读.这是我的代码
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),允许服务器告诉客户它期望发送多少数据.

如果服务器提前知道总数据大小,只需通过发送传输中的总字节数开始,然后发送数据.客户端知道何时收到所有数据.

(或者服务器可以在完成后简单地关闭连接,这样读取失败,但只有在以后不需要连接的情况下才可以)

猜你在找的Java相关文章