为什么Jsch Channel中的connect()和connect(timeout)的处理方式不同?

时间:2019-02-18 10:36:09

标签: java jsch

我正在考虑为我的Jsch连接明确设置超时(默认值为20s),但是我发现,无论是否将超时作为参数传递,其行为都是不同的。

public void connect() throws JSchException{
    connect(0);
}

public void connect(int connectTimeout) throws JSchException{
    this.connectTimeout=connectTimeout;
    try{
        sendChannelOpen();
        start();
    }
    catch(Exception e){
        connected=false;
        disconnect();
        if(e instanceof JSchException)
            throw (JSchException)e;
        throw new JSchException(e.toString(), e);
    }
}

在第一种情况下,您只等待超时时间一次,在第二种情况下,您有2000次10ms重试。

    protected void sendChannelOpen() throws Exception {
        Session _session=getSession();
        if(!_session.isConnected()){
            throw new JSchException("session is down");
        }

        Packet packet = genChannelOpenPacket();
        _session.write(packet);

        int retry=2000;
        long start=System.currentTimeMillis();
        long timeout=connectTimeout;
        if(timeout!=0L) retry = 1;
        synchronized(this){
            while(this.getRecipient()==-1 &&
                    _session.isConnected() &&
                    retry>0){
                if(timeout>0L){
                    if((System.currentTimeMillis()-start)>timeout){
                        retry=0;
                        continue;
                    }
                }
                try{
                    long t = timeout==0L ? 10L : timeout;
                    this.notifyme=1;
                    wait(t);
                }
                catch(java.lang.InterruptedException e){
                }
                finally{
                    this.notifyme=0;
                }
                retry--;
            }
        }
        if(!_session.isConnected()){
            throw new JSchException("session is down");
        }
        if(this.getRecipient()==-1){  // timeout
            throw new JSchException("channel is not opened.");
        }
        if(this.open_confirmation==false){  // SSH_MSG_CHANNEL_OPEN_FAILURE
            throw new JSchException("channel is not opened.");
        }
        connected=true;
    }

有人知道这是什么解释吗?

谢谢

0 个答案:

没有答案