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

时间:2015-07-12 01:48:02

标签: java sockets connection objectinputstream

我想尝试从套接字的输入流中读取一段时间,然后在没有收到任何输入的情况下执行其他操作 我知道我可以为套接字设置超时

mySocket.setSoTimeout(200);

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

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 );
}

如果这不起作用,还有其他方法吗? 加上如果流开始读取并且它超时将在它的中间停止或者它将继续直到流中没有更多的字节 如:如果200ms通过,它会在开始读取对象后超时吗?

我想做这样的事情

    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="";
  }

谢谢大家

1 个答案:

答案 0 :(得分:1)

  

如果我在套接字输入流

上设置超时

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

  

即使我将该流转换为其他类型,它仍然可以工作吗?

此处没有其他类型的转换。您正在包装另一种类型的套接字输入流。套接字读取超时无法受此影响,套接字也无法知道您已完成它。

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

  

加上如果流开始读取并且它超时将在它的中间停止或者它将继续直到流中没有更多的字节

我也无法做到这一点,但是如果你得到超时,则意味着在超时期限内没有数据到达。它并没有打破这种联系。但是如果你在读取对象的过程中以某种方式获得超时,它可能会破坏ObjectInputStream,

NB:

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

  2. connection.isClosed()返回false时循环是不正确的。当对等方关闭连接时,它并没有神奇地成为现实。在这种情况下,正确的技术是循环,直到你得到EOFException.