我尝试使用jsch
库连接到SFTP服务器。这就是我的方式:
public class SFTPConnection {
private String sftpHost;
private String sftpUser;
private String sftpPass;
private String sftpWorkDir;
private Session session = null;
private Channel channel = null;
private ChannelSftp channelSftp = null;
static final String SFTPHOST = "prod-sftp.host.ru";
static final String SFTPUSER = "user";
static final String SFTPPASS = "pass";
static final String SFTPWORKINGDIRINC = "/dir/Port_Increment/";
static final String SFTPWORKINGDIRFULL = "/dir/Port_All_Full/";
public SFTPConnection(String sftpHost, String sftpUser, String sftpPass, String sftpWorkDir) throws JSchException, SftpException {
this.sftpHost = sftpHost;
this.sftpUser = sftpUser;
this.sftpPass = sftpPass;
this.sftpWorkDir = sftpWorkDir;
JSch jsch = new JSch();
session = jsch.getSession(this.sftpUser, this.sftpHost, 3232);
session.setPassword(this.sftpPass);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
channelSftp.cd(this.sftpWorkDir);
}
public SFTPConnection() throws JSchException, SftpException {
sftpWorkDir = SFTPWORKINGDIRINC;
JSch jsch = new JSch();
session = jsch.getSession(SFTPUSER, SFTPHOST, 3232);
session.setPassword(SFTPPASS);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
channelSftp.cd(SFTPWORKINGDIRINC);
}
public static void main(String[] args) {
try {
SFTPConnection con=new SFTPConnection();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
}
}
}
此代码适用于我的计算机,但现在我需要将其部署在另一台具有高安全级别的服务器上。这就是我所拥有的。 例外是:
com.jcraft.jsch.JSchException: java.net.ConnectException: Connection timed out: connect
at com.jcraft.jsch.Util.createSocket(Util.java:344)
at com.jcraft.jsch.Session.connect(Session.java:215)
at com.jcraft.jsch.Session.connect(Session.java:183)
at SFTPConnection.<init>(SFTPConnection.java:53)
at SFTPConnection.main(SFTPConnection.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at com.jcraft.jsch.Util.createSocket(Util.java:338)
... 9 more
我尝试使用相同参数的WinSCP进行连接。我试图将端口从3232
更改为22
,但仍然是此错误。怎么了?
UPD:
我无法ping prod-sftp.host.ru
:
Pinging #ipaddress# with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
但是telnet可以连接到第22个端口。
PS
大多数参数都不是真实的。不要试图自己ping它。我只是不想与你分享主机,用户名和密码。
答案 0 :(得分:3)
您是否尝试过禁用任何一方的防火墙,众所周知,Java FTP被许多防火墙阻止。
您是否尝试使用Filezilla等其他软件检查主机是否在主机上可用,只是为了确保错误在您的代码中而不是其他地方,例如主机名拼写错误等。
答案 1 :(得分:0)
当您的堆栈跟踪告诉您时,客户端无法与服务器建立连接。你正在使用ftp,它不能很好地应对当今的网络基础设施。您可能应该查看RFC连接的RFC。
简而言之,您的客户端只是为了协商另一个通信端口而连接到服务器的控制端口。
您可以随时使用其他FTP客户端检查连接,例如lftp
。
答案 2 :(得分:0)
您是否尝试过指定超时? 你可以在之前做到:
session.connect();
添加:
session.setTimeout(20000);
在我的代码中,我还添加了这个:
jsch.setKnownHosts(System.getProperty( “的user.home”)+ “/ SSH / known_hosts中。”);
此致
Konki