Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java objectinputstream available()返回0_Java_Sockets_Rpc - Fatal编程技术网

Java objectinputstream available()返回0

Java objectinputstream available()返回0,java,sockets,rpc,Java,Sockets,Rpc,我正在从事套接字编程和实现自定义请求-响应协议。同样,我在JavaSocket API中使用了ObjectInputstream和ObjectOutputstream 我遇到的问题是检查数据(在我的例子中是对象)是否可读取,为此我尝试使用ObjectInputstream.available(),但即使数据流上可用,它也返回0 为什么会这样 所以我提出了解决方案:使用异常并在无限运行的循环中处理它们,所以即使出现异常(读取超时),它也会尝试再次读取 我怀疑这样做是否好的做法?或者如果你有任何其他

我正在从事套接字编程和实现自定义请求-响应协议。同样,我在JavaSocket API中使用了
ObjectInputstream
ObjectOutputstream

我遇到的问题是检查数据(在我的例子中是对象)是否可读取,为此我尝试使用
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时间

我不太明白你的话

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

因为事实并非如此。如果返回0,则无法从流中读取任何数据。是什么让你如此确信确实有数据


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

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


不过,我不建议在网络通信中使用
ObjectStreams
。考虑到头部信息和其他被传输的内容,它在大多数情况下都不太合适。您最好设计自己的协议来使用,只需通过网络发送字节。

我相信这回答了您的问题:禁用读取超时对我来说是可行的。谢谢。对于协议实现,将这些对象转换为字节传输它们然后在接收端收集所有这些字节将它们转换回对象是否合适?你们不认为它会增加两端的转换,并影响系统的性能吗?你们认为ObjectStreams会做什么?只有字节在网络上移动,而不是对象。如果您不熟悉序列化的工作方式,我不建议您使用ObjectStreams。如果你是初学者,我还建议你不要考虑性能。你只会对什么是好的性能做出错误的假设和决定。首先关注应用程序的正确性。
InputStream.available()
的实现允许始终返回零。参见Javadoc。它们被允许这样做,并且
InputStream
本身也可以这样做,但是子类则需要这样做。javadoc声明:“[返回]可以在不阻塞的情况下从该输入流读取(或跳过)的字节数的估计值,或者在到达输入流末尾时为0”。所以0有一个非常特殊的意义。