JSch 是一个纯 Java 实现的 SSH2 的客户端库,可以用来实现安全文件传输(SFTP)等功能。下面是一个使用 JSch 库在 Java 中分发大文件到各个服务器的示例代码。请注意,在实际应用中,你需要处理异常、日志记录以及可能的认证失败等问题。
首先,确保你已经将 JSch 库添加到项目的依赖中。如果你使用 Maven,可以在 pom.xml
文件中添加以下依赖:
xml
com.jcraft
jsch
0.1.55
以下是一个简单的示例,展示如何使用 JSch 分发大文件到多个服务器:
java
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class FileDistributor {
public static void main(String[] args) {
String localFilePath = "/path/to/your/largefile.zip"; // 本地大文件路径
List<String> serverHosts = new ArrayList<>(); // 服务器列表
serverHosts.add("host1.example.com");
serverHosts.add("host2.example.com");
serverHosts.add("host3.example.com");
String username = "your_username"; // SSH 用户名
String password = "your_password"; // SSH 密码
String remoteDirectory = "/remote/directory/"; // 远程目录
for (String host : serverHosts) {
distributeFile(host, username, password, localFilePath, remoteDirectory);
}
}
private static void distributeFile(String host, String username, String password, String localFilePath, String remoteDirectory) {
Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
try {
JSch jsch = new JSch();
session = jsch.getSession(username, host, 22);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
// 进入远程目录
channelSftp.cd(remoteDirectory);
// 使用 InputStream 来上传大文件
try (InputStream inputStream = new FileInputStream(localFilePath)) {
channelSftp.put(inputStream, "filename.zip"); // "filename.zip" 是远程文件名
}
System.out.println("File successfully distributed to: " + host);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (channelSftp != null) {
channelSftp.exit();
}
if (channel != null) {
channel.disconnect();
}
if (session != null) {
session.disconnect();
}
}
}
}
这个例子中,distributeFile
方法负责连接到指定的服务器,上传本地文件到远程目录,并在完成后关闭连接。main
方法中初始化了服务器列表、本地文件路径、用户名、密码和远程目录,然后遍历服务器列表,对每个服务器调用 distributeFile
方法。
请根据实际情况调整服务器地址、用户名、密码、本地文件路径和远程目录。同时,确保本地文件路径和远程目录的权限允许文件传输。
注意:在实际的生产环境中,应该使用密钥认证而不是密码认证,并且应该妥善处理异常和日志记录。此外,如果文件非常大,可能需要考虑分块传输或者使用更高级的文件传输工具。