什么可能导致从JSch通道接收输出的线程在打印输出时挂起

时间:2011-08-20 15:58:40

标签: jsch

最近我发现通过Jsch channel.getInputStream()打印大量文本时出现问题。

使用此代码:

outputStream_from_outputChannel = channel.getInputStream();
br = new BufferedReader(new InputStreamReader(outputStream_from_outputChannel));
while ( (line = br.readLine()) != null ){
    System.out.println(line);
    numOfLines++;
}

...有时(大部分时间)我会得到结果,但有时它会停止产生打印输出而不返回,这意味着打印将停在中间并且线程将挂起。您认为可能是由于什么?到目前为止,我发现这不是jsch会话的结果。它的超时设置为0.有没有人遇到过这个?

2 个答案:

答案 0 :(得分:0)

您需要首先检查流是否已准备就绪:

byte[] tmp = new byte[1024];
while (outputStream_from_outputChannel.available() > 0) {
    int i = is.read(tmp, 0, 1024);
    if (i < 0)
        break;
    someStrBuff.append(new String(tmp, 0, i));
}

答案 1 :(得分:0)

如果远程服务器停止响应(由于诸如网络连接,过载等原因),有时从通道输入流中读取会挂起,但会永久地流式传输readline方法块。该问题的解决方案是使用以下方法设置服务器活动间隔:

session.setServerAliveInterval(int milliseconds);

它将发送捎带数据包,以便在指定的时间间隔后检查连接。如果在检查连接时没有收到服务器的响应,则readline将返回。