JAVA切换不了FTP服务器目录_socket实现两台FTP服务器指定目录下的文件转移(不依赖第三方jar包)...

该博客介绍了一种使用JAVA实现的FTP文件转移方法,通过直接建立Socket连接,不依赖第三方jar包,完成两台FTP服务器之间指定目录的文件转移。详细步骤包括连接FTP服务器、读取源服务器目录、文件流传输及断开连接等操作。
摘要由CSDN通过智能技术生成

packagecom.xxx.ftp.client;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.io.OutputStreamWriter;importjava.net.Socket;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;importjava.util.StringTokenizer;importcom.xxx.ftp.model.ConnectInfo;importcom.xxx.ftp.model.FtpServerInfo;public classFtpFileTransfer {/*** 文件转移

*

*@paramsource

* 源ftp文件目录

*@paramdest

* 目标ftp文件目录

*@throwsIOException*/

public void transfer(FtpServerInfo source, FtpServerInfo dest) throwsIOException {//源ftp目录下的文件列表

sendCommand(source.getConnect(), "CWD " +source.getDir());

sendCommand(source.getConnect(),"PASV");

String response=readNewMessage(source.getConnect());

String[] ipPort=getIPPort(response);

String ip= ipPort[0];int port = Integer.valueOf(ipPort[1]);

Socket dataSocket= newSocket(ip, port);

sendCommand(source.getConnect(),"LIST");

BufferedReader br= new BufferedReader(newInputStreamReader(dataSocket.getInputStream()));//读取源服务器的目录下所有文件名称

List fileNameList = new ArrayList();

String s= "";while ((s = br.readLine()) != null) {

String fileInfo= new String(s.getBytes("ISO-8859-1"), "utf-8");

String[] arr= fileInfo.split("\\s+");

String fileName= arr[arr.length - 1];

fileNameList.add(fileName);

System.out.println(fileName);

}if (fileNameList.size() > 0) {for (Iterator iterator =fileNameList.iterator(); iterator.hasNext();) {//根据文件名获取文件流

String fileName =(String) iterator.next();

sendCommand(source.getConnect(),"PASV");

response=readNewMessage(source.getConnect());

ipPort=getIPPort(response);

ip= ipPort[0];

port= Integer.valueOf(ipPort[1]);

Socket sourceDataSocket= newSocket(ip, port);

sendCommand(source.getConnect(),"RETR " + source.getDir() + "/" +fileName);

InputStream inputStream=sourceDataSocket.getInputStream();//文件流通过socket传输至目标ftp服务器文件目录下(输入流->输出流)

sendCommand(dest.getConnect(), "PASV");

response=readNewMessage(dest.getConnect());

ipPort=getIPPort(response);

ip= ipPort[0];

port= Integer.valueOf(ipPort[1]);

Socket destDataSocket= newSocket(ip, port);

sendCommand(dest.getConnect(),"STOR " + dest.getDir() + "/" +fileName);

OutputStream outputStream=destDataSocket.getOutputStream();intoffset;byte[] bytes = new byte[1024];while ((offset = inputStream.read(bytes)) != -1) {

outputStream.write(bytes,0, offset);

}

inputStream.close();

outputStream.close();

dataSocket.close();

}

}

System.out.println("transfer success!");

}/*** ftp服务器连接

*

*@paramftpServerInfo

* ftp服务器信息 包含用户名 密码

*@return*@throwsIOException*/

public ConnectInfo connect(FtpServerInfo ftpServerInfo) throwsIOException {

Socket socket= newSocket(ftpServerInfo.getHost(), ftpServerInfo.getPort());

BufferedReader reader= new BufferedReader(newInputStreamReader(socket.getInputStream()));

BufferedWriter writer= new BufferedWriter(newOutputStreamWriter(socket.getOutputStream()));

ConnectInfo connectInfo= newConnectInfo();

connectInfo.setSocket(socket);

connectInfo.setWriter(writer);

connectInfo.setReader(reader);

sendCommand(connectInfo,"USER " +ftpServerInfo.getUser());

sendCommand(connectInfo,"PASS " +ftpServerInfo.getPass());returnconnectInfo;

}/*** 断开ftp服务器连接

*

*@paramconnectInfo

*@throwsIOException*/

public void disconnect(ConnectInfo connectInfo) throwsIOException {if (connectInfo.getSocket() == null || !connectInfo.getSocket().isConnected()) {return;

}

connectInfo.getSocket().close();

}/*** 发送ftp命令

*

*@paramconnectInfo

* ftp服务器连接信息

*@paramcommand

* ftp命令

*@throwsIOException*/

private void sendCommand(ConnectInfo connectInfo, String command) throwsIOException {if (command == null || command == "") {return;

}

connectInfo.getWriter().write(command+ "\r\n");

connectInfo.getWriter().flush();

}/*** 根据连接读取ftp信息

*

*@paramconnect

*@return*@throwsIOException*/

private String readNewMessage(ConnectInfo connect) throwsIOException {

String response= null;while (true) {

response=connect.getReader().readLine();if (response == null || response.length() == 0) {return null;

}

String rexp= "Entering Passive Mode";if(response.contains(rexp)) {break;

}

}returnresponse;

}/*** 获取ip和端口

*

*@paramresponse

*@return*@throwsIOException*/

private String[] getIPPort(String response) throwsIOException {

String[] ret= new String[2];

String ip= null;int port = -1;int opening = response.indexOf('(');int closing = response.indexOf(')', opening + 1);if (closing > 0) {

String dataLink= response.substring(opening + 1, closing);

StringTokenizer tokenizer= new StringTokenizer(dataLink, ",");try{

ip= tokenizer.nextToken() + "." + tokenizer.nextToken() + "." + tokenizer.nextToken() + "."

+tokenizer.nextToken();

port= Integer.parseInt(tokenizer.nextToken()) * 256 +Integer.parseInt(tokenizer.nextToken());

}catch(Exception e) {throw new IOException("SimpleFTP received bad data link information: " +response);

}

}

ret[0] =ip;

ret[1] =String.valueOf(port);returnret;

}public static void main(String[] args) throwsIOException {

FtpFileTransfer ft= newFtpFileTransfer();//源ftp服务器

FtpServerInfo source = newFtpServerInfo();

source.setHost("192.168.11.129");

source.setUser("haoxr");

source.setPass("123456");

source.setDir("/home/haoxr/test");

ConnectInfo sourceConnectInfo=ft.connect(source);

source.setConnect(sourceConnectInfo);//目标ftp服务器

FtpServerInfo dest = newFtpServerInfo();

dest.setHost("192.168.11.130");

dest.setUser("haoxr");

dest.setPass("123456");

dest.setDir("/home/haoxr/test");

ConnectInfo destConnectInfo=ft.connect(dest);

dest.setConnect(destConnectInfo);//文件转移

ft.transfer(source, dest);

ft.disconnect(sourceConnectInfo);

ft.disconnect(destConnectInfo);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要获取FTP服务器上的所有文件,包括子文件文件,您可以使用递归函数来遍历FTP服务器目录树。下面是一个示例代码,演示如何使用递归函数来获取FTP服务器上的所有文件: ```java import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class FTPDemo { public static void main(String[] args) { String server = "ftp.example.com"; int port = 21; String user = "username"; String pass = "password"; String remoteDirPath = "/"; FTPClient ftpClient = new FTPClient(); try { // 连接到FTP服务器 ftpClient.connect(server, port); ftpClient.login(user, pass); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 获取服务器上的所有文件 getAllFiles(ftpClient, remoteDirPath, "C:/downloads/"); } catch (IOException ex) { System.out.println("连接到FTP服务器失败: " + ex.getMessage()); ex.printStackTrace(); } finally { try { if (ftpClient.isConnected()) { ftpClient.logout(); ftpClient.disconnect(); } } catch (IOException ex) { ex.printStackTrace(); } } } private static void getAllFiles(FTPClient ftpClient, String remoteDirPath, String localDirPath) throws IOException { FTPFile[] files = ftpClient.listFiles(remoteDirPath); for (FTPFile file : files) { if (file.isFile()) { String remoteFilePath = remoteDirPath + "/" + file.getName(); String localFilePath = localDirPath + "/" + file.getName(); OutputStream outputStream = new FileOutputStream(localFilePath); InputStream inputStream = ftpClient.retrieveFileStream(remoteFilePath); byte[] bytesArray = new byte[4096]; int bytesRead = -1; while ((bytesRead = inputStream.read(bytesArray)) != -1) { outputStream.write(bytesArray, 0, bytesRead); } boolean success = ftpClient.completePendingCommand(); if (success) { System.out.println("文件 " + remoteFilePath + " 下载成功。"); } inputStream.close(); outputStream.close(); } else if (file.isDirectory()) { String dirPath = remoteDirPath + "/" + file.getName(); String localDir = localDirPath + "/" + file.getName(); File localDirFile = new File(localDir); if (!localDirFile.exists()) { localDirFile.mkdir(); } getAllFiles(ftpClient, dirPath, localDir); } } } } ``` 在上面的代码,我们定义了一个名为`getAllFiles()`的递归函数,该函数接受FTP客户端、远程目录路径和本地目录路径作为参数。函数首先使用`listFiles()`方法获取FTP服务器上的所有文件文件夹。如果是一个文件,我们就下载它,并将它保存在本地文件。如果是一个文件夹,我们就递归调用`getAllFiles()`函数,以获取文件的所有文件和子文件文件,并将它们保存在本地文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值