轻松掌握!教你如何使用Java搭建FTP服务器 (java搭建ftp服务器)

FTP(File Transfer Protocol)是一种常用的文件传输协议,主要用于在网络上进行文件传输和共享。对于开发者来说,搭建自己的FTP服务器是非常重要的,可以帮助他们更加便捷地共享文件,提高生产效率。Java作为一种非常流行的编程语言,也可以用来搭建FTP服务器。接下来,本文将教你如何使用Java搭建FTP服务器。

一、环境配置

在使用Java搭建FTP服务器之前,需要先配置Java环境。以下是配置Java环境的步骤:

1. 下载安装Java Development Kit(JDK),并在系统环境变量中配置JAVA_HOME环境变量。

2. 在系统环境变量中配置PATH环境变量,将JDK的bin目录加入到PATH变量中。

3. 打开终端或命令提示符,输入java -version命令,如果出现Java版本信息,表示Java环境配置成功。

二、依赖项

在使用Java搭建FTP服务器之前,还需要下载FTP服务器的依赖项。以下是下载步骤:

1. 下载FTP服务器依赖项。一般来说,可以通过Maven依赖管理工具来下载FTP服务器的依赖项。具体来说,需要在pom.xml文件中添加以下依赖项:

“`xml

org.apache.ftpserver

ftpserver-core

1.1.1

“`

其中,groupId表示依赖项的组ID,artifactId表示依赖项的ArtifactID,version表示依赖项的版本号。

2. 通过Maven依赖管理工具下载依赖项。在终端或命令提示符中,进入到项目目录下,然后执行以下命令:

“`shell

mvn clean compile

“`

执行以上命令后,Maven会自动下载所需的FTP服务器依赖项。

三、代码实现

在完成Java环境的配置和FTP服务器依赖项的下载后,就可以开始编写Java代码来实现FTP服务器了。以下是实现FTP服务器的代码示例:

“`java

package com.example.ftpserver;

import java.io.IOException;

import java.net.InetAddress;

import java.nio.file.Path;

import java.nio.file.Paths;

import java.util.HashMap;

import java.util.Map;

import org.apache.ftpserver.FtpServer;

import org.apache.ftpserver.FtpServerFactory;

import org.apache.ftpserver.ftplet.Authority;

import org.apache.ftpserver.ftplet.FtpException;

import org.apache.ftpserver.ftplet.FtpStatistics;

import org.apache.ftpserver.ftplet.User;

import org.apache.ftpserver.listener.ListenerFactory;

import org.apache.ftpserver.usermanager.ClearTextPasswordEncryptor;

import org.apache.ftpserver.usermanager.impl.BaseUser;

import org.apache.ftpserver.usermanager.impl.WritePermission;

import org.slf4j.LoggerFactory;

public class FTPServer {

private final org.slf4j.Logger logger = LoggerFactory.getLogger(FTPServer.class);

public FTPServer() {

}

public void start(String host, int port, String username, String password) throws FtpException, IOException {

// 创建FTP服务器

FtpServerFactory serverFactory = new FtpServerFactory();

// 监听器工厂

ListenerFactory factory = new ListenerFactory();

// 设置FTP服务器端口号

factory.setPort(port);

// 设置FTP服务器主机地址

factory.setServerAddress(InetAddress.getByName(host));

// 注册监听器工厂

serverFactory.addListener(“default”, factory.createListener());

// 定义一个用户

BaseUser user = new BaseUser();

user.setName(username);

user.setPassword(password);

user.setHomeDirectory(“/”);

// 设置用户的权限

Path writePath = Paths.get(“/tmp/ftp”);

Map authorities = new HashMap();

authorities.put(“transfer”, new WritePermission());

// 将用户权限和目录加入到用户信息中

user.setAuthorities(authorities);

user.setHomeDirectory(writePath.toAbsolutePath().toString());

// 设置密码加密方式

user.setPasswordEncryptor(new ClearTextPasswordEncryptor());

// 将用户信息注册到FTP服务器

serverFactory.getUserManager().save(user);

// 启动FTP服务器

FtpServer server = serverFactory.createServer();

server.start();

// 输出FTP服务器地址、用户名和密码

FtpStatistics statistics = server.getStatistics();

logger.info(“FTP服务器启动成功,地址:ftp://” + host + “:” + port);

logger.info(“用户名:” + username + “,密码:” + password);

}

public static void mn(String[] args) throws FtpException, IOException {

String host = “localhost”;

int port = 2121;

String username = “ftpuser”;

String password = “ftppassword”;

FTPServer ftpServer = new FTPServer();

ftpServer.start(host, port, username, password);

}

}

“`

在上述代码中,我们首先创建一个FtpServerFactory对象,然后定义一个ListenerFactory来监听FTP服务器的端口。接下来,创建一个名为“transfer”的用户,并设置该用户的权限和目录。然后,将用户信息注册到FTP服务器。启动FTP服务器,并输出FTP服务器的地址、用户名和密码。

四、测试

在完成Java代码编写之后,就可以测试FTP服务器了。以下是测试步骤:

1. 运行Java代码。在终端或命令提示符中,进入项目目录,并执行以下命令:

“`shell

mvn exec:java

“`

2. 使用FTP客户端访问FTP服务器。可以使用任何FTP客户端(例如FileZilla、WinSCP等)来访问FTP服务器。在FTP客户端中输入FTP服务器地址、用户名和密码。如果一切设置正确,就可以连接并访问FTP服务器了。

五、

相关问题拓展阅读:

Java 代码操作带SSL的FTP服务器

参考

client = new FTPSClient(implictSSL);

KeyManagerFactory kmf = KeyManagerFactory.getInstance(“X509”);

kmf.init(KeyStore.getInstance(“BKS”), “wshr.ut”.toCharArray());

client.setTrustManager(new X509TrustManager() {

public X509Certificate getAcceptedIssuers() { return null; }

public void checkServerTrusted(X509Certificate chain, String authType) throws CertificateException { }

public void checkClientTrusted(X509Certificate chain, String authType) throws CertificateException { }

});

client.setKeyManager(kmf.getKeyManagers());

client.setNeedClientAuth(false);

怎么用Java实现FTP上传

java实现ftp文件上传功能

实现代码如下;

package com.sinosoft.sepmis.util;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import org.apache.commons.net.ftp.FTPClient;

import org.apache.commons.net.ftp.FTPReply;

/**

* Java自带的API对FTP的操作

* @Title:Ftp.java

* @author: shanhongzhi

*/

public class FtpUtil {

/**

* Description: 向FTP服务器上传文件

* @param url FTP服务器hostname

* @param port FTP服务器端口,如果默认端口请写-1

* @param username FTP登录账号

* @param password FTP登录密码

* @param path FTP服务斗渣器保存目录

* @param filename 上传到FTP服务器上的文件名

* @param input 输入流

* @return 成功返回true,否则返回false

*/

public static boolean uploadFile(String url, int port, String username, String password, String path,

String filename, InputStream input) throws Exception

{

boolean success = false;

FTPClient ftp = new FTPClient();

try

{

int reply;

// 连接FTP服务器

if (port >侍此 -1)

{

ftp.connect(url, port);

}

else

{

ftp.connect(url);

}

/老销迅/ 登录FTP

ftp.login(username, password);

reply = ftp.getReplyCode();

System.out.println(reply);

if (!FTPReply.isPositiveCompletion(reply))

{

ftp.disconnect();

return success;

}

ftp.changeWorkingDirectory(path);

ftp.storeFile(filename, input);

input.close();

ftp.logout();

success = true;

}

catch (IOException e)

{

success = false;

throw e;

}

finally

{

if (ftp.isConnected())

{

try

{

ftp.disconnect();

}

catch (IOException e)

{

throw e;

}

}

}

return success;

}

public static void main(String agrs) {

try {

File file = new File(“E:\\1.txt”);

FileInputStream in = new FileInputStream(file);

/*

* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器

*/

//返回true上传成功,否则上传失败

// FtpUtil.uploadFile(“192.168.61.209”, -22, “instiaci”, “instiaci”, “/db2home/instiaci/personal/shanhz”,”2.txt”,in);

//“sinopipi/IC/tkk”目录要是已经存在的目录

FtpUtil.uploadFile(“192.168.61.104”, 22, “administrator”, “123456”, “/sinopipi/IC”,”6.txt”,in);

} catch (Exception e) {

e.printStackTrace();

}

}

}

说明:所需的jar包是commons-net-2.0.jar

sun.net.ftp.FtpClient.,该类库主要提供了用于建立FTP连接的类。利用这些类的方法,编手薯程人员可以远程登录到FTP服务器,列举该服务器上的目录,设置传输协议,以及传送文件。FtpClient类涵盖了几乎所有FTP的功能,FtpClient的实例变量保存了有关建立”代理”的各种信息。下面给出拿携了这些实例变量:

  public static boolean useFtpProxy

  这个变量用于表明FTP传输过程中是否使用了一个代理,因此,它实际上是一个标记,此标记若为TRUE,表明使用了一个代理主机。

  public static String ftpProxyHost

  此变量只有在变量useFtpProxy为TRUE时才有效,用于保存代理主机名。

  public static int ftpProxyPort  此变量只有在变量useFtpProxy为TRUE时才有效,用于保存代理主机的端口地址。

  FtpClient有三种不同形式的构造函数,如下所示:

  1、public FtpClient(String hostname,int port)

   此构造函数利用给出的主机名和端口号建立一条FTP连接。

  2、public FtpClient(String hostname)

  此构造函数利用给出的主机名建立一条FTP连接,使用默认端口号。

  3、FtpClient()

  此构造函数将创建一FtpClient类,但不建立FTP连接。这时,FTP连接可以用openServer方法建立。

  一旦建立了类FtpClient,就可以用这个类的方法来打开与FTP服务器的连接。类ftpClient提供了如下两个可用于打开与FTP服务器之间的连接的方法。

  public void openServer(String hostname)

  这个方法用于建立一条与指定主机上的FTP服务器的连接,使用默认端口号。

  public void openServer(String host,int port)

  这个方法用于建立一条与指定主机、指定端口上的FTP服务器的连接。

  打开连接之后,接下来的工作是注册到FTP服务器。这时需要利用下面的方法。

  public void login(String username,String password)

  此方法利用参数username和password登录到FTP服务器。使用过Intemet的用户应该知道,匿名FTP服务器的登录用户名为anonymous,密码一般用自己的电子邮件地址。

  下面是FtpClient类所提供的一些控制命令。

  public void cd(String remoteDirectory):该命令用于把远程系统上的目录切换到参数remoteDirectory所指定的目录。

  public void cdUp():该命令用于把远程系统上的目录切换到上一级目录。

  public String pwd():该命令可显示远程系统上的目录状态。

  public void binary():该命令可把传输格式设置为二进制格式。

  public void ascii():该命令可把传输协议设置为ASCII码格式。

  public void rename(String string,String string1):该命令可对远程系统上的目录或者文件进行重命名操作。

  除了上述方法外,类FtpClient还提供了可用于传递并检索目录清单和文件的若干方法。这些方法返回的是可供读或写的输入、输出流。下面是其中一些主要的方法。

  public TelnetInputStream list()

  返回与远程机器上当前目录相对应的输入流。

  public TelnetInputStream get(String filename)

  获取远程机器上的文件filename,借助TelnetInputStream把该文件传送到本地。

  public TelnetOutputStream put(String filename)

  以写方式打开一输出流,通过这一输出流把文件filename传毕敏者送到远程计算机

package myUtil;

import java.io.DataInputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.util.ArrayList;

import java.util.List;

import java.util.StringTokenizer;

import sun.net.TelnetInputStream;

import sun.net.TelnetOutputStream;

import sun.net.ftp.FtpClient;

/**

* ftp上传,下载

*

* @author why

*

*/

public class FtpUtil {

private String ip = “”;

private String username = “”;

private String password = “”;

private int port = -1;

private String path = “”;

FtpClient ftpClient = null;

OutputStream os = null;

FileInputStream is = null;

public FtpUtil(String serverIP, String username, String password) {

this.ip = serverIP;

this.username = username;

this.password = password;

}

public FtpUtil(String serverIP, int port, String username, String password) {

this.ip = serverIP;

this.username = username;

this.password = password;

this.port = port;

}

/**

* 连接ftp服务器

*

* @throws IOException

*/

public boolean connectServer() {

ftpClient = new FtpClient();

try {

if (this.port != -1) {

ftpClient.openServer(this.ip, this.port);

} else {

ftpClient.openServer(this.ip);

}

ftpClient.login(this.username, this.password);

if (this.path.length() != 0) {

ftpClient.cd(this.path);// path是ftp服务下主目录的子目录

}

ftpClient.binary();// 用2进制上传、下载

System.out.println(“已登录到\”” + ftpClient.pwd() + “\”目录”);

return true;

} catch (IOException e) {

e.printStackTrace();

return false;

}

}

/**

* 断开与ftp服务器连接

*

* @throws IOException

*/

public boolean closeServer() {

try {

if (is != null) {

is.close();

}

if (os != null) {

os.close();

}

if (ftpClient != null) {

ftpClient.closeServer();

}

System.out.println(“已从服务器断开”);

return true;

} catch (IOException e) {

e.printStackTrace();

return false;

}

}

/**

* 检查文件夹在当前目录下是否存在

*

* @param dir

*@return

*/

private boolean isDirExist(String dir) {

String pwd = “”;

try {

pwd = ftpClient.pwd();

ftpClient.cd(dir);

ftpClient.cd(pwd);

} catch (Exception e) {

return false;

}

return true;

}

/**

* 在当前目录下创建文件夹

*

* @param dir

* @return

* @throws Exception

*/

private boolean createDir(String dir) {

try {

ftpClient.ascii();

StringTokenizer s = new StringTokenizer(dir, “/”); // sign

s.countTokens();

String pathName = ftpClient.pwd();

while (s.hasMoreElements()) {

pathName = pathName + “/” + (String) s.nextElement();

try {

ftpClient.sendServer(“MKD ” + pathName + “\r\n”);

} catch (Exception e) {

e = null;

return false;

}

ftpClient.readServerResponse();

}

ftpClient.binary();

return true;

} catch (IOException e1) {

e1.printStackTrace();

return false;

}

}

/**

* ftp上传 如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换

*

* @param filename

*要上传的文件(或文件夹)名

* @return

* @throws Exception

*/

public boolean upload(String filename) {

String newname = “”;

if (filename.indexOf(“/”) > -1) {

newname = filename.substring(filename.lastIndexOf(“/”) + 1);

} else {

newname = filename;

}

return upload(filename, newname);

}

/**

* ftp上传 如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换

*

* @param fileName

*要上传的文件(或文件夹)名

* @param newName

*服务器段要生成的文件(或文件夹)名

* @return

*/

public boolean upload(String fileName, String newName) {

try {

String savefilename = new String(fileName.getBytes(“GBK”),

“GBK”);

File file_in = new File(savefilename);// 打开本地待长传的文件

if (!file_in.exists()) {

throw new Exception(“此文件或文件夹有误或不存在!”);

}

if (file_in.isDirectory()) {

upload(file_in.getPath(), newName, ftpClient.pwd());

} else {

uploadFile(file_in.getPath(), newName);

}

if (is != null) {

is.close();

}

if (os != null) {

os.close();

}

return true;

} catch (Exception e) {

e.printStackTrace();

System.err.println(“Exception e in Ftp upload(): ” + e.toString());

return false;

} finally {

try {

if (is != null) {

is.close();

}

if (os != null) {

os.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 真正用于上传的方法

*

* @param fileName

* @param newName

* @param path

* @throws Exception

*/

private void upload(String fileName, String newName, String path)

throws Exception {

String savefilename = new String(fileName.getBytes(“ISO”), “GBK”);

File file_in = new File(savefilename);// 打开本地待长传的文件

if (!file_in.exists()) {

throw new Exception(“此文件或文件夹有误或不存在!”);

}

if (file_in.isDirectory()) {

if (!isDirExist(newName)) {

createDir(newName);

}

ftpClient.cd(newName);

File sourceFile = file_in.listFiles();

for (int i = 0; i =0 成功上传,返回文件的大小

* @throws Exception

*/

public long uploadFile(String filename, String newname) throws Exception {

long result = 0;

TelnetOutputStream os = null;

FileInputStream is = null;

try {

java.io.File file_in = new java.io.File(filename);

if (!file_in.exists())

return -1;

os = ftpClient.put(newname);

result = file_in.length();

is = new FileInputStream(file_in);

byte bytes = new byte;

int c;

while ((c = is.read(bytes)) != -1) {

os.write(bytes, 0, c);

}

} finally {

if (is != null) {

is.close();

}

if (os != null) {

os.close();

}

}

return result;

}

/**

* 从ftp下载文件到本地

*

* @param filename

*服务器上的文件名

* @param newfilename

*本地生成的文件名

* @return

* @throws Exception

*/

public long downloadFile(String filename, String newfilename) {

long result = 0;

TelnetInputStream is = null;

FileOutputStream os = null;

try {

is = ftpClient.get(filename);

java.io.File outfile = new java.io.File(newfilename);

os = new FileOutputStream(outfile);

byte bytes = new byte;

int c;

while ((c = is.read(bytes)) != -1) {

os.write(bytes, 0, c);

result = result + c;

}

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (is != null) {

is.close();

}

if (os != null) {

os.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return result;

}

/**

* 取得相对于当前连接目录的某个目录下所有文件列表

*

* @param path

* @return

*/

public List getFileList(String path) {

List list = new ArrayList();

DataInputStream dis;

try {

dis = new DataInputStream(ftpClient.nameList(this.path + path));

String filename = “”;

while ((filename = dis.readLine()) != null) {

list.add(filename);

}

} catch (IOException e) {

e.printStackTrace();

}

return list;

}

public static void main(String args) {

FtpUtil ftp = new FtpUtil(“192.168.11.11”, “111”, “1111”);

ftp.connectServer();

boolean result = ftp.upload(“C:/Documents and Settings/ipanel/桌面/java/Hibernate_HQL.docx”, “amuse/audioTest/music/Hibernate_HQL.docx”);

System.out.println(result ? “上传成功!” : “上传失败!”);

ftp.closeServer();

/**

* FTP远程命令列表 USER PORT RETR ALLO DELE SITE XMKD CDUP FEAT PASS PASV STOR

* REST CWD STAT RMD XCUP OPTS ACCT TYPE APPE RNFR XCWD HELP XRMD STOU

* AUTH REIN STRU NT RNTO LIST NOOP PWD SIZE PBSZ QUIT MODE SYST ABOR

* NLST MKD XPWD MDTM PROT

* 在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上\r\n

* ftpclient.sendServer(“XMKD /test/bb\r\n”); //执行服务器上的FTP命令

* ftpclient.readServerResponse一定要在sendServer后调用

* nameList(“/test”)获取指目录下的文件列表 XMKD建立目录,当目录存在的情况下再次创建目录时报错 XRMD删除目录

* DELE删除文件

*/

}

}

package com.sinosoft.sepmis.util;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import org.apache.commons.net.ftp.FTPClient;

import org.apache.commons.net.ftp.FTPReply;

/**

* Java自带的API对FTP的操作

* @Title:Ftp.java

* @author: shanhongzhi

*/

public class FtpUtil {

/**

* Description: 向FTP服务器上传文件

* @param url FTP服务器hostname

* @param port FTP服务器端口,如果默认端口请写-1

* @param username FTP登录账塌前戚号

* @param password FTP登录密码

* @param path FTP服务器保存目录

* @param filename 上传到FTP服务器上的文件名

* @param input 输入流

* @return 成功返团陵悔简回true,否则返回false

*/

public static boolean uploadFile(String url, int port, String username, String password, String path,

String filename, InputStream input) throws Exception

{

boolean success = false;

FTPClient ftp = new FTPClient();

try

{

int reply;

// 连接FTP服务器

if (port > -1)

{

ftp.connect(url, port);

}

else

{

ftp.connect(url);

}

// 登录FTP

ftp.login(username, password);

reply = ftp.getReplyCode();

System.out.println(reply);

if (!FTPReply.isPositiveCompletion(reply))

{

ftp.disconnect();

return success;

}

ftp.changeWorkingDirectory(path);

ftp.storeFile(filename, input);

input.close();

ftp.logout();

success = true;

}

catch (IOException e)

{

success = false;

throw e;

}

finally

{

if (ftp.isConnected())

{

try

{

ftp.disconnect();

}

catch (IOException e)

{

throw e;

}

}

}

return success;

}

public static void main(String agrs) {

try {

File file = new File(“E:\\1.txt”);

FileInputStream in = new FileInputStream(file);

/*

* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器

*/

//返回true上传成功,否则上传失败

// FtpUtil.uploadFile(“192.168.61.209”, -22, “instiaci”, “instiaci”, “/db2home/instiaci/personal/shanhz”,”2.txt”,in);

//“sinopipi/IC/tkk”目录要是已经存在的目录

FtpUtil.uploadFile(“192.168.61.104”, 22, “administrator”, “123456”, “/sinopipi/IC”,”6.txt”,in);

} catch (Exception e) {

e.printStackTrace();

}

}

}

说明:所需的jar包是commons-net-2.0.jar

Java FTP客户端工具巧肢包很多,在此我选用的Apache的FTPClient。这个包的获取可以通过

来获取,我使用的是最新的commons-net-1.4.1.zip。其中包含了众多大咐的java网络编程的工具包,官方文档列举如下:

支持网络协议如滚宽纯下:

FTP

NNTP

TP

POP3

Telnet

TFTP

Finger

Whois

rexec/rcmd/rlogin

Time (rdate) and Daytime

Echo

Discard

NTP/SNTP

java搭建ftp服务器的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java搭建ftp服务器,轻松掌握!教你如何使用Java搭建FTP服务器,Java 代码操作带SSL的FTP服务器,怎么用Java实现FTP上传的信息别忘了在本站进行查找喔。


数据运维技术 » 轻松掌握!教你如何使用Java搭建FTP服务器 (java搭建ftp服务器)