繁体   English   中英

inputstream 使程序等待

[英]inputstream make the program to wait

我正在使用 J2ssh 库连接到 Unix 机器,运行命令并使用输入流获取结果。 但是程序在读取输入流时会陷入循环。 我能够从输入的蒸汽中获得结果,但程序在那里发生并没有继续。 为什么程序卡在那个循环中?

这是源代码,

public void loginAndCheckProcess(String hostName, String userName, String password, String port) {
        try {
            SshConnector con = SshConnector.createInstance();

            SocketTransport transport = new SocketTransport(hostName, 22);
            transport.setTcpNoDelay(true);
            SshClient client = con.connect(transport, userName);

            Ssh2Client ssh2 = (Ssh2Client) client;

            PasswordAuthentication pwd = new PasswordAuthentication();
            do {
                pwd.setPassword(password);
            } while (ssh2.authenticate(pwd) != SshAuthentication.COMPLETE && client.isConnected());

            String command = "ps -ef | grep " + port + '\n';
            if (client.isAuthenticated()) {
                SshSession session = client.openSessionChannel();
                session.startShell();
                session.getOutputStream().write(command.getBytes());
                InputStream is = session.getInputStream();
                Scanner br = new Scanner(new InputStreamReader(is));

                String line = null;
                int isRunning = 0;
                while (br.hasNextLine()) {
                    line = br.nextLine();
                    isRunning++;
                    System.out.println(line);
                }
                session.close();
            }
        } catch (SshException | IOException | ChannelOpenException ex) {
            Logger.getLogger(Authenticator.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

我试图用下面的循环替换上面的第二个 while 循环,但没有运气,

try (Reader in = new InputStreamReader(is, "UTF-8")) {
                    for (;;) {
                        int rsz = in.read(buffer, 0, buffer.length);
                        if (rsz < 0)
                            break;
                        out.append(buffer, 0, rsz);
                    }
                }
                System.out.println(out);

并使用以下循环,但没有运气,

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

最后我找到了答案,谢谢曼古斯塔。

我在套接字上添加了超时。 有效。 我刚刚在程序中添加了以下行,

transport.setSoTimeout(3000);

您的代码将继续在会话 InputStream 上循环,直到会话关闭,即 InputStream 返回 EOF。 当您使用 startShell 方法时,这会产生一个交互式 shell,因此会话将继续并在您的命令执行后显示一个新提示,等待另一个命令。

您可以在命令中添加退出调用

String command = "ps -ef | grep " + port + ';exit\n';

或者您可以在会话上使用替代的 executeCommand 方法,而不是将命令写出到 OutputStream。

session.executeCommand(command);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM