0

最近、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 に設定されています。

4

2 に答える 2

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));
}
于 2012-08-03T02:36:49.043 に答える
0

リモート サーバーが応答を停止した場合 (ネットワーク接続、過負荷などの理由により)、チャネル入力ストリームからの読み取りがハングすることがありますが、ストリームの readline メソッドは永久にブロックされます。問題の解決策は、次を使用してサーバーのアライブ間隔を設定することです。

session.setServerAliveInterval(int milliseconds);

指定された時間間隔の後、接続を確認するためにピギーバック パケットを送信します。また、接続を確認するときにサーバーから応答がない場合は、readline が返されます。

于 2017-05-17T14:16:19.793 に答える