Button JSch/SSHJ-单击按钮连接到SSH服务器
我正在尝试通过单击按钮连接到SSH Unix服务器(代码是用actionPerformed()方法编写的)。我正在使用JSch连接到SSH服务器。代码是在SwingWorker类中编写的,因为它是一个网络操作Button JSch/SSHJ-单击按钮连接到SSH服务器,button,ssh,click,jsch,Button,Ssh,Click,Jsch,我正在尝试通过单击按钮连接到SSH Unix服务器(代码是用actionPerformed()方法编写的)。我正在使用JSch连接到SSH服务器。代码是在SwingWorker类中编写的,因为它是一个网络操作 private void testConnectionButtonActionPerformed(java.awt.event.ActionEvent evt) {
private void testConnectionButtonActionPerformed(java.awt.event.ActionEvent evt) {
SwingWorker<Boolean, Void> sw = new SwingWorker<Boolean, Void>(){
@Override
protected Boolean doInBackground() throws Exception {
JSch jsch = new JSch();
String host = "ServerHost";
String username = "username";
String password = "password";
Session session = jsch.getSession(username, host);
session.setPassword(password);
session.setTimeout(20000);
System.out.println("Connecting to server...");
session.connect();
return true;
}
@Override
public void done(){
try {
System.out.println(get().toString());
} catch (Exception ex) {
System.out.err(ex);
}
}
};
sw.execute();
}
但每当我在独立程序中运行相同的代码时,我的意思是,如果我用普通方法编写actionPerformed()方法,并从main()方法调用它,那么我就要编写actionPerformed()方法。它会起作用的。当我将相同的代码与Button Click的actionPerformed()方法集成时,它将给出上述异常
任何人都可以建议我在这里做错了什么,或者应该对代码进行任何修改
我尝试使用“SSHJ”实现连接到SSH服务器,但出现以下错误:
java.net.SocketException: Connection reset
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at javax.swing.SwingWorker.get(SwingWorker.java:583)
有人能帮我吗?如何前进?我将您的代码打包到一些GUI代码中(并将其转换为非泛型,以便能够使用与其他JSch示例相同的设置进行编译)。它对我有用。试试这个,并报告您得到的异常(它有更多的异常日志记录)
导入java.awt.event.*;
导入javax.swing.*;
导入java.awt.*;
导入com.jcraft.jsch.*;
类SwingWorkerExample{
JTextField-hostField;
JTextField userNameField;
JTextField密码字段;
JPanel小组;
公共SwingWorkerExample(){
JPanel p=面板=新JPanel(新网格布局(0,2));
hostField=新的JTextField(20);
userNameField=newjtextfield(20);
passwordField=新的JPasswordField(20);
JButton testButton=newjbutton(“connect!”);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件ev){
测试连接按钮已执行(ev);
}
});
p、 添加(新JLabel(“主机:”);
p、 添加(主机字段);
p、 添加(新JLabel(“用户:”);
p、 添加(用户名字段);
p、 添加(新JLabel(“密码:”);
p、 添加(密码字段);
p、 添加(测试按钮);
}
公共JPanel getPanel(){
返回面板;
}
私有void testConnectionButtonActionPerformed(ActionEvent evt){
SwingWorker sw=新SwingWorker(){
受保护对象doInBackground()引发异常{
试一试{
JSch JSch=新的JSch();
字符串host=hostField.getText();
字符串username=userNameField.getText();
字符串password=passwordField.getText();
Session Session=jsch.getSession(用户名、主机);
session.setPassword(密码);
session.setConfig(“StrictHostKeyChecking”、“no”);
会话设置超时(20000);
System.out.println(“连接到服务器…”);
session.connect();
返回会议;
}
捕获(例外情况除外){
例如printStackTrace();
掷骰子;
}
}
公众假期结束(){
试一试{
System.out.println(get());
}捕获(例外情况除外){
例如printStackTrace();
}
}
};
sw.execute();
}
公共静态void main(字符串[]egal){
invokeLater(新Runnable(){public void run()){
SwingWorkerExample ex=新的SwingWorkerExample();
JFrame f=新JFrame(“bla”);
f、 setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f、 setContentPane(例如getPanel());
f、 包装();
f、 setVisible(真);
}});
}
}
它对我有效(如果我更改服务器名称、密码和设置以接受服务器的公钥,并更正您的system.out.err
)。Paulo,您能告诉我您希望我设置什么来接受服务器的公钥吗?一段代码将非常有用。谢谢但这不是您的问题,您的程序甚至没有达到这一点(连接被拒绝或不允许)。检查您的防火墙设置。在您要求我放置代码以接受服务器的公钥后,我做了同样的事情,但它没有连接到服务器,防火墙设置很好,因为当我独立运行它时,没有将代码放入actionPerformed()方法中-它会工作,但当我将此代码与actionPerformed()连接时方法-它无法连接。无法找到正确的原因。还有其他建议吗?这也可以在我的github上找到(比如现在的branch swingworker)。Paulo,我已经执行了你的代码,它运行得很好。我使用Netbeans 7创建GUI,有一个类:[org.jdesktop.application.ResourceMap],我使用它从属性文件中获取属性值。我用它来设置按钮文本,标签文本。如果我在代码中不使用该类文件,则session.connect()正在工作。我真的不知道这里的关系为什么无法连接。如果我使用哪怕一行ResourceMap类,它也不会连接。有什么想法吗?不知道,我从没上过这门课。这可能是一个类加载器问题-由于某些依赖关系,如果使用ResourceMap,可能会在类路径中重复某些类,从而导致加载错误的类?我的类路径中不存在此类,我尝试了“javap org.jdesktop.application.ResourceMap”。观察这种行为是很奇怪的,所以现在唯一的办法就是避开这门课?
java.net.SocketException: Connection reset
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at javax.swing.SwingWorker.get(SwingWorker.java:583)