对象输入流可用()returns0

objectinputstream available() returns 0

我正在从事套接字编程和实现自定义请求响应协议。同样,我在 java 套接字 API.

中使用了 ObjectInputstreamObjectOutputstream

我卡住的地方是检查数据(在我的例子中是对象)是否可以读取,为此我尝试使用 ObjectInputstream.available() 但它返回 0 即使数据可在直播中使用。

为什么会这样?

所以我想到了解决方案:使用异常并在无限运行循环中处理它们,所以即使发生异常(读取超时)它也会尝试重新读取。

我怀疑这样做是不是一个好习惯?或者如果您有任何其他解决方案建议。

while (true){
    try {
        request = rpcClient.getRequest();
        System.out.println(request);
        // use threads to handle request for faster response(make use of request IDs)
        rpcClient.sendResponse("test response");

    } catch (SocketException e)
    {// thrown when connection reset
        System.out.println("Connection reset :  Server is down.....");
        break;
    } catch (IOException e){
        // thrown when read time out
        System.out.println("read time out: listening again");
    } catch (ClassNotFoundException e){
        e.printStackTrace();
    }

}

这不是一个好的做法,因为无限循环会耗尽您的 CPU 时间。

我不太明白你的说法

but it is returning 0 even if data is available on stream

因为事实并非如此。如果它returns 0,则没有可以从流中读取的数据。是什么让您如此确定确实有数据?

另外:我看不到调用 available() 的代码。你能编辑你的问题吗?

您一开始就不应该使用 available()。禁用读取超时,这样你就可以让线程等待直到有东西要读取(或连接断开)。

不过,我不建议使用 ObjectStreams 进行网络通信。考虑到 header 信息和其他要传输的内容,它在大多数情况下不太适合。你最好设计自己的协议来使用并通过网络发送字节。