我正致力于套接字编程和实现自定义请求响应协议。同样,我在java socket 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();
}
}
答案 0 :(得分:0)
这不是一个好习惯,因为无限循环会占用你的CPU时间。
我不太明白你的陈述
但即使数据在流上可用,它也会返回0
因为事实并非如此。如果它返回0,则没有可以从流中读取的数据。是什么让你确定实际上有数据?
另外:我看不到调用available()
的代码。你可以编辑你的问题吗?
答案 1 :(得分:0)
您不应该首先使用available()
。禁用读取超时,因此您可以让线程等待,直到有东西要读(或连接断开)。
我不建议使用ObjectStreams
进行网络通信。考虑到标题信息和其他转移的内容,它在大多数情况下都不太合适。您最好设计自己的协议以便通过网络发送字节。