objectinputstream available()返回0

时间:2015-07-09 08:02:12

标签: java sockets rpc

我正致力于套接字编程和实现自定义请求响应协议。同样,我在java socket 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();
    }

}

2 个答案:

答案 0 :(得分:0)

这不是一个好习惯,因为无限循环会占用你的CPU时间。

我不太明白你的陈述

  

但即使数据在流上可用,它也会返回0

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

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

答案 1 :(得分:0)

您不应该首先使用available()。禁用读取超时,因此您可以让线程等待,直到有东西要读(或连接断开)。

我不建议使用ObjectStreams进行网络通信。考虑到标题信息和其他转移的内容,它在大多数情况下都不太合适。您最好设计自己的协议以便通过网络发送字节。