JDK:支持JSP用的玩意
mysql:一种数据库,一般和PHP、JSP等搭配
APACHE:一种webserver,也就是运行网站用的。
建议你使用护卫神·主机大师(Linux版),一键安装ftp+apache+mysql+php
通过JDK自带的API实现
package com.cloudpower.util
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.IOException
import sun.net.TelnetInputStream
import sun.net.TelnetOutputStream
import sun.net.ftp.FtpClient
/**
* Java自带的API对FTP的操作
* @Title:Ftp.java
* @author: 周玲斌
*/
public class Ftp {
/**
* 本地文件名
*/
private String localfilename
/**
* 远程文件名
*/
private String remotefilename
/**
* FTP客户端
*/
private FtpClient ftpClient
/**
* 服务器连接
* @param ip 服务器IP
* @param port 服务器端口
* @param user 用户名
* @param password 密码
* @param path 服务器路径
* @author 周玲斌
* @date 2012-7-11
*/
public void connectServer(String ip, int port, String user,
String password, String path) {
try {
/* ******连接服务器的两种方法*******/
//第一种方法
//ftpClient = new FtpClient()
//ftpClient.openServer(ip, port)
//第二种方法
ftpClient = new FtpClient(ip)
ftpClient.login(user, password)
// 设置成2进制传输
ftpClient.binary()
System.out.println("login success!")
if (path.length() != 0){
//把远程系统上的目录切换到参数path所指定的目录
ftpClient.cd(path)
}
ftpClient.binary()
} catch (IOException ex) {
ex.printStackTrace()
throw new RuntimeException(ex)
}
}
/**
* 关闭连接
* @author 周玲斌
* @date 2012-7-11
*/
public void closeConnect() {
try {
ftpClient.closeServer()
System.out.println("disconnect success")
} catch (IOException ex) {
System.out.println("not disconnect")
ex.printStackTrace()
throw new RuntimeException(ex)
}
}
/**
* 上传文件
* @param localFile 本地文件
* @param remoteFile 远程文件
* @author 周玲斌
* @date 2012-7-11
*/
public void upload(String localFile, String remoteFile) {
this.localfilename = localFile
this.remotefilename = remoteFile
TelnetOutputStream os = null
FileInputStream is = null
try {
//将远程文件加入输出流中
os = ftpClient.put(this.remotefilename)
//获取本地文件的输入流
File file_in = new File(this.localfilename)
is = new FileInputStream(file_in)
//创建一个缓冲区
byte[] bytes = new byte[1024]
int c
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c)
}
System.out.println("upload success")
} catch (IOException ex) {
System.out.println("not upload")
ex.printStackTrace()
throw new RuntimeException(ex)
} finally{
try {
if(is != null){
is.close()
}
} catch (IOException e) {
e.printStackTrace()
} finally {
try {
if(os != null){
os.close()
}
} catch (IOException e) {
e.printStackTrace()
}
}
}
}
/**
* 下载文件
* @param remoteFile 远程文件路径(服务器端)
* @param localFile 本地文件路径(客户端)
* @author 周玲斌
* @date 2012-7-11
*/
public void download(String remoteFile, String localFile) {
TelnetInputStream is = null
FileOutputStream os = null
try {
//获取远程机器上的文件filename,借助TelnetInputStream把该文件传送到本地。
is = ftpClient.get(remoteFile)
File file_in = new File(localFile)
os = new FileOutputStream(file_in)
byte[] bytes = new byte[1024]
int c
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c)
}
System.out.println("download success")
} catch (IOException ex) {
System.out.println("not download")
ex.printStackTrace()
throw new RuntimeException(ex)
} finally{
try {
if(is != null){
is.close()
}
} catch (IOException e) {
e.printStackTrace()
} finally {
try {
if(os != null){
os.close()
}
} catch (IOException e) {
e.printStackTrace()
}
}
}
}
public static void main(String agrs[]) {
String filepath[] = { "/temp/aa.txt", "/temp/regist.log"}
String localfilepath[] = { "C:\\tmp\\1.txt","C:\\tmp\\2.log"}
Ftp fu = new Ftp()
/*
* 使用默认的端口号、用户名、密码以及根目录连接FTP服务器
*/
fu.connectServer("127.0.0.1", 22, "anonymous", "IEUser@", "/temp")
//下载
for (int i = 0i <filepath.lengthi++) {
fu.download(filepath[i], localfilepath[i])
}
String localfile = "E:\\号码.txt"
String remotefile = "/temp/哈哈.txt"
//上传
fu.upload(localfile, remotefile)
fu.closeConnect()
}
}
学习了计算机网络之后,利用java写了一个ftp服务器。一、实现的ftp命令
实现了基本的user,pass,list,port,quit,retr,cwd,stor等命令
二、以上命令所对应的功能
对应的功能是:下载,上传,获取服务器目录,切换目录等
三、用于测试的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命令的实现
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)