套接字输入流在最终读取时挂起.最好的方法来处理这个?

Chr*_*ght 12 java sockets

我有点难过如何避免我的插座挂在阅读上.这是我的代码:

    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 (...) {}
Run Code Online (Sandbox Code Playgroud)

上面的代码成功读取了流中的所有数据,但随后挂起.在网上阅读我希望从服务器(我无法控制)收到-1表示我已经到达流的末尾,但我得到了这个:

(Lots of data above this point)
57
10
37
37
69
79
70
10
Run Code Online (Sandbox Code Playgroud)

它然后挂起.所以,我的问题是:

1)我是否编码错误或服务器响应有问题?

2)如果服务器的响应存在问题(即没有返回-1),我该如何解决这个问题(即挂起时停止读取).

任何帮助赞赏!

MTi*_*ted 12

只停止读取会挂起的问题是这种情况可能发生在两种情况:

1:服务器没有更多要发送的数据

2:服务器已发送更多数据,但由于网络过载,您的客户端尚未收到数据.

而你只想在第一种情况下真正停止阅读,但你希望在第二种情况下读取阻止.

解决这个问题的方法是制作一个传输协议(标准),它允许服务器告诉客户端它希望发送多少数据.

如果服务器事先知道总数据大小,只需从传输中发送总字节数开始,然后发送数据.这样客户端就知道它什么时候收到了所有数据.

(或者服务器完成后可以简单地关闭连接.这种方式read应该会失败,但这只有在将来不需要连接的情况下才有效)


JB *_*zet 5

我认为只有当服务器决定停止对话时才会得到-1,即关闭其输出流或完全关闭套接字.此外,该流保持开放以用于潜在的未来传入数据.