输入流使程序等待

我使用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));
                }

解决方案:

我终于找到了答案,谢谢你mangusta。

我在socket上加了超时。它的工作。我只是在程序中添加了以下一行。

transport.setSoTimeout(3000);

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何从字符串中删除尾部的逗号(Java)

2022-9-8 10:49:39

未分类

qml TableView itemdelegate未触发(使用QAbstractTableModel)。

2022-9-8 10:49:41

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索