如何在Android

时间:2018-04-23 18:55:04

标签: java android android-studio ssh jsch

我正在编写一个应用程序,通过SSH连接到服务器。我的目的是为应用程序的用户提供互联网连接,只要他们连接到服务器(SSH脚本作为Android服务运行)。问题是,当我开始一个会话并创建一个频道时,一切正常。但是在大约20-30分钟(有时长达几个小时)之后,频道和会话就会关闭。

连接功能:

 public String connecting(
        String username,
        final String password,
        String hostname,
        int port) {

    try {
        Log.d("MainActivity", "Start JSch session and connect");
        jsch = new JSch();
        session = jsch.getSession(username, hostname, port);

        session.setPassword(password);

        // Avoid asking for key confirmation
        Properties prop = new Properties();
        prop.put("StrictHostKeyChecking", "no");
        session.setConfig(prop);
        session.connect();
        session.setServerAliveInterval(15);
        session.setServerAliveCountMax(100);


        Channel channel = session.openChannel("shell");
        channel.setInputStream(System.in);
        channel.setOutputStream(System.out);
        channel.connect();

        InputStream in = channel.getInputStream();
        serviceStatus = true;
        streamtext = "";
        byte[] tmp = new byte[1024];
        while (true) {
            while (in.available() > 0) {
                int i = in.read(tmp, 0, 1024);
                if (i < 0) break;
                streamtext = new String(tmp, 0, i);

                }
            }
            if (channel.isClosed()) {
                if (in.available() > 0) continue;
                Log.d(TAG, "exit-status: " + channel.getExitStatus());
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (Exception ee) {
                ee.printStackTrace();
            }
        }

        return streamtext;
    } catch (Exception except){
        except.printStackTrace();
        passErrorToActivity("Error: Connection error");
        return "Error: Connection error";
    }
}

启动功能:

public void start(){
        try {
            new AsyncTask<Integer, Void, Void>() {
                @Override
                protected Void doInBackground(Integer... params) {
                    try {
                    passMessageToActivity(connecting(user, password, host, port));
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                    return null;
                }
            }.execute(1);
        } catch (Exception exc) {
            exc.printStackTrace();
        }

“passMessageToActivity”只需创建一个intent并将“streamtext”发送到MainActivity

我已经用Session#setServerAliveInterval(int milliseconds)尝试了它,但它没有用。有没有可能让会话和频道保持活力? 我已经看到了解决方案of this user,但这对我不起作用,因为服务器和服务之间的连接总是很重要。

1 个答案:

答案 0 :(得分:0)

  • 如果仅设置keepalive没有帮助,则需要使会话忙于更高级别的操作。就像发送虚拟命令一样,如pwd。虽然你可能需要解释,为什么你有&#34; shell&#34;会议开放,看起来很可疑。
  • 无论如何,你无法保证连接保持活跃状态​​。无论如何,你必须偶尔处理丢失连接。