如何从Java桌面应用程序连接到internet服务器?我需要访问MySQL数据库和上传/下载文件。我拥有的主机(one.com)不支持远程数据库访问,因此我尝试使用SSH。我一点也不知道这件事。我试过各种代码示例,但它们中没有一个比连接更远。我将jsch.jar添加到我的项目中。我是否还需要添加/安装其他东西,或者我遗漏了什么?
public static void main(String args[])
{
String user = "user";
String password = "pass";
String host = "00.000.00.000";
int port=22;
String remoteFile="/home/mywebsite.com/test.txt";
try
{
JSch jsch = new JSch();
Session session = (Session) jsch.getSession(user, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
System.out.println("Establishing Connection...");
session.connect();
System.out.println("Connection established.");
System.out.println("Creating SFTP Channel.");
ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
sftpChannel.connect();
System.out.println("SFTP Channel created.");
InputStream out= null;
out= sftpChannel.get(remoteFile);
try (BufferedReader br = new BufferedReader(new InputStreamReader(out))) {
String line;
while ((line = br.readLine()) != null)
System.out.println(line);
}
}
catch(JSchException | SftpException | IOException e){System.err.print(e);}
}我知道错误:
com.jcraft.jsch.JSchException: java.net.ConnectException: Connection timed out: connect
BUILD SUCCESSFUL (total time: 24 seconds)或者,为了实现与我的站点和数据库的远程连接,我还有其他选择吗?
P.S.我已经尝试了几乎所有来自堆栈溢出的示例代码,并且都被困在了同一点上。
谢谢!
发布于 2016-03-09 22:33:59
Connection timed out表示您试图连接到端口22上不接受SSH连接的服务器,或者您的主机不正确。host = "00.000.00.000";是您要连接的实际IP地址,还是您为堆栈溢出问题更改的IP地址?
发布于 2016-03-09 22:38:12
我不打算调试您的代码,但是我将告诉您如何实现这一点。
解决方案是在将SSH“端口转发”嵌入Java代码之前使用SSH“端口转发”,您应该首先从命令行中设置它,以了解它的工作原理。如果命令行隧道就足够了,您可能不需要编写任何代码。
ssh -L3306:localhost:3306 <databaseHost>这将创建一个从您计算机的端口3306到<databaseHost>,然后从<databaseHost>到localhost的SSH“隧道”。计算机上到本地端口3306的任何连接都会通过SSH隧道传输到<databaseHost>,然后再连接到<databaseHost>所知道的任何localHost,即返回到端口3306上。
当您的Java代码连接到数据库时,它应该连接到localhost:3306。注意,数据库连接字符串中的localhost引用的是您的计算机,而ssh命令中的一个是从远程服务器的角度出发的,因此它们的含义不同。
总之,从您的Java代码到远程MySQL服务器的数据包运行如下:
Connect to my computer port 3306
Intercepted by ssh
Encrypted and transmitted to remote database server
Decrypted by sshd and fed to port 3306 on the same server
Received by MySQL running on the remote host对于返回数据包,此过程被反转,由本地ssh客户端和远程sshd守护进程管理。
请注意,这可以用于更有趣的案例。例如,假设远程ssh服务器和数据库服务器在同一个防火墙后面的不同系统上。假设ssh主机以gateway.xyz.com的形式可见,而数据库主机位于10.0.0.3的内部局域网上,这是不能从因特网访问的,而是可以从网关到达的。
ssh -L3306:10.0.0.3:3306 gateway.xyz.com然后是分组路由。
Your computer 3306
Received by ssh
Encryption and sent to gateway.xyz.com
Decrypted by sshd forwarded to 10.0.0.3:3306
Received at 10.0.0.3:3306 by MySQL要明确的是,这是在执行Java代码之前从命令行设置的,这应该发生在与ssh命令不同的会话中。只要ssh命令正在运行,隧道就仍然可用。
https://stackoverflow.com/questions/35903937
复制相似问题