JSch永无止境的输入流阻塞线程

时间:2014-08-06 23:20:25

标签: java inputstream jsch

我正在使用JSch从路由器提取数据,但路由器提示的工作方式阻止我成功读取数据。

流程应该是这样的:

router>drop_into_privileged_mode
Password: password_entered_here
router#give_me_data
...Data goes here...
router#

我遇到的问题是,由于路由器在give_me_data之后退回到shell提示符,InputStream永远不会死。自然的选择是运行give_me_data; exit;give_me_data && exit之类的命令,但不幸的是路由器的操作系统不允许我链接这样的命令。同样令人沮丧的是,命令give_me_data需要很长时间才能运行,将exit命令放入OutputBuffer不会执行任何操作(因为它在另一个命令仍在运行时被发送而不会被解释)。

我有没有办法保留InputStream的连接,但是杀了连接?如果可能,那么缓冲区将具有自然结束(因为连接已死),我可以将其复制到变量。或者,如果有一种方法可以将流中当前存在的所有信息传输出去,那么终止连接也会有效。

我尝试过类似StackOverflow问题中提出的解决方案,例如this onethis one无效。

此外,这里是我正在使用的代码(这是我设计的解决方案,它遇到了相同的阻塞问题):

    InputStream in = channel.getInputStream(); //This gets the output from the router
    byte[] buffer = new byte[1024];
    StringBuffer stringBuffer = new StringBuffer();
    while (true) {
        while (in.available() > 0) {
            int i = in.read(buffer, 0, 1024);
            if (i < 0) {
                break;
            }
            stringBuffer.append(new String(buffer, "UTF-8"));
        }
        System.out.println("done");

        channel.disconnect();  // this closes the jsch channel

        if (channel.isClosed()) {
            if (in.available() > 0) {
                continue;
            }
            System.out.println("exit-status: " + channel.getExitStatus());
            break;
        }
        try{
            Thread.sleep(1000);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }   

0 个答案:

没有答案