gpt4 book ai didi

java - 如果我在套接字上设置超时,即使我将其包装在另一种类型中,它的输入流仍然会抛出超时异常

转载 作者:行者123 更新时间:2023-11-30 08:04:24 24 4
gpt4 key购买 nike

我想尝试从套接字的输入流读取一段时间,然后如果没有收到任何输入则执行其他操作我知道我可以为套接字设置一个超时来执行此操作

mySocket.setSoTimeout(200);

但即使我将其封装在 ObjectInputStream 中,它仍然可以工作吗(InputStream 是否仍会向我的 catch block 抛出异常)

public void startClient(){
try {
connection = new Socket(InetAddress.getByName(hostName), port);
output = new ObjectOutputStream( connection.getOutputStream());
output.flush();
input = new ObjectInputStream( connection.getInputStream());
}
catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
ExecutorService worker = Executors.newSingleThreadExecutor();
worker.execute( this );
}

如果这不起作用,还有其他方法吗?另外,如果流开始读取并且超时,它会在中间停止还是会继续,直到流中不再有字节如:如果 200 毫秒过去,流开始读取对象后是否会超时?

我想做这样的事情

    while(!connection.isClosed()){
try{
com = (String) input.readObject();
if(com.equals("TERMINATE CONNECTION")){
closeConnection();
}else if(com.equals("SEND DATA")){
sendData();
}
}catch(timeout exception){
if( timedout and want to do something){ do something else ....}
}
com="";
}

谢谢大家

最佳答案

If I set a timeout on the socket's input stream

您没有“在套接字输入流上设置超时”。您可以在套接字本身上设置超时。

will it still work even if I cast that stream to another type?

这里没有转换为其他类型。您正在用另一种类型包装套接字输入流。套接字读取超时不可能受此影响,并且套接字甚至无法知道您已经完成了它。

简而言之,这个问题没有意义。

plus if the stream starts reading and it times out will it stop in the middle of it or will it continue until there are no more bytes in the stream

我也无法弄清楚这一点,但如果超时,则意味着在超时时间内没有数据到达。它不会中断连接。然而,如果您在读取对象的过程中以某种方式超时,它可能会破坏 ObjectInputStream

注意:

  1. 超时本身表现为 SocketTimeoutException,,而不是您在 if-else 链中检测到的内容。

  2. connection.isClosed() 返回 false 时循环是不正确的。当对等方关闭连接时,它不会神奇地变为真。在这种情况下,正确的技术是循环,直到收到 EOFException。

关于java - 如果我在套接字上设置超时,即使我将其包装在另一种类型中,它的输入流仍然会抛出超时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31363592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com