我正在编写一个应用程序,通过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,但这对我不起作用,因为服务器和服务之间的连接总是很重要。
答案 0 :(得分:0)
pwd
。虽然你可能需要解释,为什么你有&#34; shell&#34;会议开放,看起来很可疑。