java中怎么实现ftp服务器学习java代码连接ftp了计算机网络之后java代码连接ftp,利用java写了一个ftp服务器 。
一、实现的ftp命令
实现了基本的user,pass,list,port,quit,retr,cwd,stor等命令
二、以上命令所对应的功能
对应的功能是:下载java代码连接ftp , 上传,获取服务器目录,切换目录等
三、用于测试的ftp客户端:windows自带的ftp客户端
四、实现的思想
1、使用ServerSocket进行监听 , 每个控制连接的请求到来之后,开启一个线程进行处理(这里使用的java bio,效率较差,对于控制连接最好使用NIO处理 , 之后会再写个
nio的实现)
2、 对于命令使用工厂方法模式进行设计,当需要添加新的命令的时候 , 只需要添加一个新的命令类,实现相应接口,修改工厂产生逻辑 , 而不用修改其他的程序代码 。可
扩展性较好,同时符合开闭原则 。
五、实现过程中碰到的问题
1、对于tcp与socket的关系理解错误,以为所有的数据的输入都是要经过serverSocket().accept()方法 。其实,ServerSocket.accept()所对应的是tcp里面的三次握手建
立连接的阶段 , 之后的tcp的连接由客户端和服务器端的一对socket来维护,是属于establish阶段 , 在这个阶段,通信是全双工的,任何一方都能够发送数据 。
socket.close()对应的阶段是断开连接(四次挥手)的阶段 。
2、刚开始对于ftp协议不是很理解,不知道他的工作方式是怎样的,后来在看了tcp协议卷里面的ftp的内容之后,才知道ftp命令和应答码是关键 。eg:刚开始测试时,在
输入用户名之后 , 不会提示输入密码的 。原因:没有返回对应的应答码:331.另外要注意的是:返回的数据要以换行回车作为结束--\r\n.
六、代码列表
简单说明:
ftpServer:是服务器的主程序,入口,同时负责监听本地的21号端口 。
ControllerThread.java:用于处理控制连接的线程(每一个控制连接请求对应一个线程)ps:实在很浪费(流量小,连接多) 。
Share:一些全局性数据的维护 。
Command:是命令接口 , 定义了一个所有命令都要实现的方法 。
CommandFactory:命令工厂,通过传人的参数,决定生成的命令对象 。
UserCommand,PortCommand等:是具体ftp命令的实现
java中怎么实现ftp文件传输package com.quantongfu.;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.List;
import org.apache.commons.net.;
import org.apache.log4j.Logger;
import org.apache.log4j.net.SocketServer;
import com.quantongfu.conf.FtpConf;
/**
* @项目名称: telinSyslog
* @文件名称:
* @创建日期:2015年9月14日 下午3:22:08
* @功能描述:ftp实体类,用于连接 , 上传
* @修订记录:
*/
public class Ftp {
private static Logger logger = Logger.getLogger();
private FTPClient ftp;
/**
*
* @param path
*上传到ftp服务器哪个路径下
* @param addr
*地址
* @param port
*端口号
* @param username
*用户名
* @param password
*密码
* @return
* @throws Exception
*/
public boolean connect() throws Exception {
boolean result = false;
ftp = new FTPClient();
int reply;
(FtpConf.FTP_HOST, FtpConf.FTP_PORT);
(FtpConf.FTP_USER_NAME, FtpConf.FTP_PASSWORD);
;
;
reply = ;
if (!FTPReply.isPositiveCompletion(reply)) {
;
return result;
}
if (FtpConf.IS_FTP_DIRECTORY) {
;
}
result = true;
return result;
}
/**
*
* @param files
*上传的文件
* @throws Exception
*/
public boolean upload(File file) throws IOException {
FileInputStream input = null;
try {
input = new FileInputStream(file);
boolean b = (file.getName()".tmp", input);
if (b) {
b = (file.getName()".tmp", file.getName());
}
return b;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (input != null) {
input.close();
}
}
}
/**
*
* @param files
*上传的文件
* @throws Exception
*/
public boolean upload(ServerSocket server, File file) throws Exception {
FileInputStream input = null;
try {
if (!file.exists()) {
return true;
}
input = new FileInputStream(file);
boolean b = (server, file.getName()".tmp", input);
if (b) {
b = (file.getName()".tmp", file.getName());
if (b) {
file.delete();
}
}
return b;
} catch (Exception e) {
logger.error("ftp error"e.getMessage());
return false;
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/*断开连接*/
public void disConnect() {
try {
if (ftp != null) {
;
}
} catch (IOException e) {
e.printStackTrace();
}
}
/*获取连接*/
public static Ftp getFtp() {
Ftp ftp = new Ftp();
try {
;
} catch (Exception e) {
logger.error("FTP连接异常"e.getMessage());
e.printStackTrace();
}
return ftp;
}
/*重连*/
public Ftp reconnect() {
disConnect();
return getFtp();
}
}
使用Apache FtpClient jar包 , 获取jar :
java连接ftp是主动模式还是被动模式正常情况下,默认使用主动模式 连接ftp;如果ftp仍然是登陆成功但是没有上传或下载文件,就在登陆后加入一行代码,客户端使用被动方式连接ftp服务端
ftpC.login(user, password);
//ftpC.enterLocalPassiveMode();
if (null != remotePath) {
// 打开进入指定目录
ftpC.changeWorkingDirectory(remotePath);
}
如何用JAVA实现FTP访问在主函数中 , 完成服务器端口的侦听和服务线程的创建 。我们利用一个静态字符串变量initDir 来保存服务器线程运行时所在的工作目录 。服务器的初始工作目录是由程序运行时用户输入的,缺省为C盘的根目录 。
具体的代码如下:
public class ftpServer extends Thread{
private Socket socketClient;
private int counter;
private static String initDir;
public static void main(String[] args){
if(args.length != 0) {
initDir = args[0];
}else{ initDir = "c:";}
int i = 1;
try{
System.out.println("ftp server started!");
//监听21号端口
ServerSocket s = new ServerSocket(21);
for(;;){
//接受客户端请求
Socket incoming = s.accept();
//创建服务线程
new ftpServer(incoming,i).start();
i;
}
}catch(Exception e){}
}
如何用java连接到ftp上现在已经封装好了的方法,不需要任何其他知识即可连接的 。只需要知道ftp登录用户名、密码、端口、存储路径即可 。
package zn.ccfccb.util;
import hkrt.b2b.view.util.Log;
import hkrt.b2b.view.util.ViewUtil;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.commons.net.;
import org.apache.commons.net.;
public class CCFCCBFTP {
/**
* 上传文件
*
* @param fileName
* @param plainFilePath 明文文件路径路径
* @param filepath
* @return
* @throws Exception
*/
public static String fileUploadByFtp(String plainFilePath, String fileName, String filepath) throws Exception {
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
FTPClient ftpClient = new FTPClient();
String bl = "false";
try {
fis = new FileInputStream(plainFilePath);
bos = new ByteArrayOutputStream(fis.available());
byte[] buffer = new byte[1024];
int count = 0;
while ((count = fis.read(buffer)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
Log.info("加密上传文件开始");
Log.info("连接远程上传服务器" CCFCCBUtil.CCFCCBHOSTNAME ":" 22);
ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);
ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);
//Log.info("连接远程上传服务器" "192.168.54.106:" 2021);
//ftpClient.connect("192.168.54.106", 2021);
//ftpClient.login("hkrt-CCFCCBHK", "3OLJheziiKnkVcu7Sigz");
FTPFile[] fs;
fs = ftpClient.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(filepath)) {
bl="true";
ftpClient.changeWorkingDirectory("/" filepath "");
}
}
Log.info("检查文件路径是否存在:/" filepath);
if("false".equals(bl)){
ViewUtil.dataSEErrorPerformedCommon( "查询文件路径不存在:" "/" filepath);
return bl;
}
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("GBK");
// 设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile(fileName, fis);
Log.info("上传文件成功:" fileName " 。文件保存路径:" "/" filepath "/");
return bl;
} catch (Exception e) {
throw e;
} finally {
if (fis != null) {
try {
fis.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
if (bos != null) {
try {
bos.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
}
}
/**
*下载并解压文件
*
* @param localFilePath
* @param fileName
* @param routeFilepath
* @return
* @throws Exception
*/
public static String fileDownloadByFtp(String localFilePath, String fileName,String routeFilepath) throws Exception {
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
FileOutputStream fos = null;
FTPClient ftpClient = new FTPClient();
String SFP = System.getProperty("file.separator");
String bl = "false";
try {
Log.info("下载并解密文件开始");
Log.info("连接远程下载服务器" CCFCCBUtil.CCFCCBHOSTNAME ":" 22);
ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);
ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);
//ftpClient.connect(CMBCUtil.CMBCHOSTNAME, 2021);
//ftpClient.login(CMBCUtil.CMBCLOGINNAME, CMBCUtil.CMBCLOGINPASSWORD);
FTPFile[] fs;
ftpClient.makeDirectory(routeFilepath);
ftpClient.changeWorkingDirectory(routeFilepath);
bl = "false";
fs = ftpClient.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
bl = "true";
Log.info("下载文件开始 。");
ftpClient.setBufferSize(1024);
// 设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
InputStream is = ftpClient.retrieveFileStream(fileName);
bos = new ByteArrayOutputStream(is.available());
byte[] buffer = new byte[1024];
int count = 0;
while ((count = is.read(buffer)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
fos = new FileOutputStream(localFilePath SFP fileName);
fos.write(bos.toByteArray());
Log.info("下载文件结束:" localFilePath);
}
}
Log.info("检查文件是否存:" fileName "" bl);
if("false".equals(bl)){
ViewUtil.dataSEErrorPerformedCommon("查询无结果,请稍后再查询 。");
return bl;
}
return bl;
} catch (Exception e) {
throw e;
} finally {
if (fis != null) {
try {
fis.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
if (bos != null) {
try {
bos.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
if (fos != null) {
try {
fos.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
JAVA编写FTP连接报错java.net.ConnectException: Connection refused: connect FTP你用的FTPClient引入不对吧,我们项目上都是用的
import org.apache.commons.net.;
import org.apache.commons.net.;
import org.apache.commons.net.;
下面是我们项目上用到的FTP的实现代码(FTP需要先连接,再登录,之后就是校验登录是否成功),具体代码如下:
/**
* 获取FTPClient对象
*
* @param ftpHost FTP主机服务器
* @param ftpPassword FTP 登录密码
* @param ftpUserName FTP登录用户名
* @param ftpPort FTP端口 默认为21
* @return FTPClient
* @throws Exception
*/
public static FTPClient getFTPClient(String ftpHost, String ftpUserName,
String ftpPassword, int ftpPort) throws Exception {
try {
FTPClient ftpClient = new FTPClient();
ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
logger.error("未连接到FTP,用户名或密码错误!");
ftpClient.disconnect();
return null;
} else {
logger.info("FTP连接成功!");
return ftpClient;
}
} catch (SocketException socketException) {
logger.error("FTP的IP地址可能错误,请正确配置!");
throw socketException;
} catch (IOException ioException) {
logger.error("FTP的端口错误,请正确配置!");
throw ioException;
}
}
【java代码连接ftp java代码连接mysql数据库】关于java代码连接ftp和java代码连接mysql数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- js左右轮播事件视频教程,javascript图片轮播左右按钮
- erp系统实施效果评估,erp系统评价
- c语言自定义函数计算素数 c语言中用函数求素数
- 倒置拍摄有什么好处,倒置手机拍照是什么意思
- chatgpt显示地区不支持,twitch不支持此地区
- vb.net控件属性 vb常用控件属性
- 安卓手机怎么识别u盘,安卓手机怎么看u盘
- 如何把线下引流搞好合作,线下引流是啥意思
- 即时贴图游戏,即时贴图案