objectinputstream available() 返回 0

Posted

技术标签:

【中文标题】objectinputstream available() 返回 0【英文标题】:objectinputstream available() returns 0 【发布时间】:2015-07-09 08:02:12 【问题描述】:

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


【问题讨论】:

我相信这回答了你的问题:***.com/questions/26769428/… 【参考方案1】:

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

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

【讨论】:

禁用读取超时对我有用。谢谢。对于协议实现,将这些对象转换为字节传输它们然后在接收方收集所有这些字节将它们转换回对象是否会很好?您不认为它会增加两端的转换开销并影响系统的性能。 你认为 ObjectStreams 是做什么的?只有字节在网络上移动,而不是对象。如果您不熟悉序列化的工作原理,我不建议您使用 ObjectStreams。如果您是初学者,我还建议您不要考虑性能(暂时)。你只会对什么是好的性能做出错误的假设和决定。首先关注应用程序的正确性。【参考方案2】:

这不是一个好习惯,因为无限循环会消耗您​​的 CPU 时间。

我不太明白你的说法

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

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

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

【讨论】:

InputStream.available() 的实现允许始终返回零。请参阅 Javadoc。 他们被允许这样做,InputStream 自己这样做,但子类应该这样做。 javadoc 声明:“[返回] 可以从该输入流中读取(或跳过)的字节数的估计值而不会阻塞,或者当它到达输入流的末尾时为 0”。所以0有很特殊的含义。

以上是关于objectinputstream available() 返回 0的主要内容,如果未能解决你的问题,请参考以下文章

转:ObjectInputStream类和ObjectInputStream类的使用

The POM for cn.e3mall:e3mall-common:jar:0.0.1-SNAPSHOT is missing, no dependency information availab

对象反序列化流ObjectInputStream

ObjectInputStream(socket.getInputStream());不工作

java.io.ObjectInputStream

ObjectInputStream和ObejctOutputStream