组网教程 电脑入门 经验共享 系统知识 办公软件 网页教程 QQ知识 MSN知识 黑客教程
木马知识 安全漏洞 补丁知识 入侵知识 防火墙 影音制作 Premiere 硬件知识 Photoshop
Fireworks Flash教程 CorelDRAW Dreamweaver ASP教程 PHP教程 HTML教程 JAVA教程 
CataName - 电脑教程搜索  关键字:   

当前位置:首页 > 电脑教程 > JAVA教程

用Java实现FTP服务器
作者:未知 文章来源:未知 点击数:1613 更新时间2005-6-16

  FTP 命令

  FTP 的主要操作都是基于各种命令基础之上的。常用的命令有:

  ◆ 设置传输模式,它包括ASCⅡ(文本) 和BINARY 二进制模式;

  ◆ 目录操作,改变或显示远程计算机的当前目录(cd、dir/ls 命令);

  ◆ 连接操作,open命令用于建立同远程计算机的连接;close命令用于关闭连接;

  ◆ 发送操作,put命令用于传送文件到远程计算机;mput 命令用于传送多个文件到远程计算机;

  ◆ 获取操作,get命令用于接收一个文件;mget命令用于接收多个文件。

  编程思路

  根据FTP 的工作原理,在主函数中建立一个服务器套接字端口,等待客户端请求,一旦客户端请求被接受,服务器程序就建立一个服务器分线程,处理客户端的命令。如果客户端需要和服务器端进行文件的传输,则建立一个新的套接字连接来完成文件的操作。

  编程技巧说明

  1.主函数设计

  在主函数中,完成服务器端口的侦听和服务线程的创建。我们利用一个静态字符串变量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){}
}
2. 线程类的设计

  线程类的主要设计都是在run()方法中实现。用run()方法得到客户端的套接字信息,根据套接字得到输入流和输出流,向客户端发送欢迎信息。

  3. FTP 命令的处理

  (1) 访问控制命令

  ◆ user name(user) 和 password (pass) 命令处理代码如下:

if(str.startsWith("USER")){
user = str.substring(4);
user = user.trim();
out.println("331 Password");}
if(str.startsWith("PASS"))
out.println("230 User "+user+" logged in.");

  User 命令和 Password 命令分别用来提交客户端用户输入的用户名和口令。

  ◆ CWD (CHANGE WORKING DIRECTORY) 命令处理代码如下:

if(str.startsWith("CWD")){
String str1 = str.substring(3);
dir = dir+"/"+str1.trim();
out.println("250 CWD command succesful");
}

  该命令改变工作目录到用户指定的目录。

  ◆ CDUP (CHANGE TO PARENT DIRECTORY) 命令处理代码如下:

if(str.startsWith("CDUP")){
int n = dir.lastIndexOf("/");
dir = dir.substring(0,n);
out.println("250 CWD command succesful");
}

  该命令改变当前目录为上一层目录。

  ◆ QUIT命令处理代码如下:

if(str.startsWith("QUIT")) {
out.println("GOOD BYE");
done = true;
}

  该命令退出及关闭与服务器的连接,输出GOOD BYE。

  (2) 传输参数命令

  ◆ Port命令处理代码如下:

if(str.startsWith("PORT")) {
out.println("200 PORT command successful");
int i = str.length() - 1;
int j = str.lastIndexOf(",");
int k = str.lastIndexOf(",",j-1);
String str1,str2;
str1="";
str2="";
for(int l=k+1;lstr1 = str2 + str.charAt(l);
}
for(int l=j+1;l<=i;l++){
str2 = str2 + str.charAt(l);
}
tempPort = Integer.parseInt(str1) * 16 *16 +Integer.parseInt(str2);
}

  使用该命令时,客户端必须发送客户端用于接收数据的32位IP 地址和16位 的TCP 端口号。这些信息以8位为一组,使用十进制传输,中间用逗号隔开。

  ◆ TYPE命令处理代码如下:

if(str.startsWith("TYPE")){
out.println("200 type set");
}


  TYPE 命令用来完成类型设置。

  (3) FTP 服务命令

  ◆ RETR (RETEIEVE) 和 STORE (STORE)命令处理的代码

if(str.startsWith("RETR")){
out.println("150 Binary data connection");
str = str.substring(4);
str = str.trim();
RandomAccessFile outFile = new
RandomAccessFile(dir+"/"+str,"r");
Socket tempSocket = new Socket(host,tempPort);
OutputStream outSocket
= tempSocket.getOutputStream();
byte byteBuffer[]= new byte[1024];
int amount;
try{
while((amount = outFile.read(byteBuffer)) != -1){
outSocket.write(byteBuffer, 0, amount);
}
outSocket.close();
out.println("226 transfer complete");
outFile.close();
tempSocket.close();
}
catch(IOException e){}
}
if(str.startsWith("STOR")){
out.println("150 Binary data connection");
str = str.substring(4);
str = str.trim();
RandomAccessFile inFile = new
RandomAccessFile(dir+"/"+str,"rw");
Socket tempSocket = new Socket(host,tempPort);
InputStream inSocket
= tempSocket.getInputStream();
byte byteBuffer[] = new byte[1024];
int amount;
try{
while((amount =inSocket.read(byteBuffer) )!= -1){
inFile.write(byteBuffer, 0, amount);
}
inSocket.close();
out.println("226 transfer complete");
inFile.close();
tempSocket.close();
}
catch(IOException e){}
}

  文件传输命令包括从服务器中获得文件RETR和向服务器中发送文件STOR,这两个命令的处理非常类似。处理RETR命令时,首先得到用户要获得的文件的名称,根据名称创建一个文件输入流,然后和客户端建立临时套接字连接,并得到一个输出流。随后,将文件输入流中的数据读出并借助于套接字输出流发送到客户端,传输完毕以后,关闭流和临时套接字。

  STOR 命令的处理也是同样的过程,只是方向正好相反。

  ◆ DELE (DELETE)命令处理代码如下:

if(str.startsWith("DELE")){
str = str.substring(4);
str = str.trim();
File file = new File(dir,str);
boolean del = file.delete();
out.println("250 delete command successful");
}

  DELE 命令用于删除服务器上的指定文件。

  ◆ LIST命令处理代码如下:

if(str.startsWith("LIST")) {
try{
out.println("150 ASCII data");
Socket tempSocket = new Socket(host,tempPort);
PrintWriter out2= new PrintWriter(tempSocket.getOutputStream(),true);
File file = new File(dir);
String[] dirStructure = new String[10];
dirStructure= file.list();
String strType="";
for(int i=0;iif( dirStructure[i].indexOf(".") == -1) {
strType = "d ";}
else
{strType = "- ";}
out2.println(strType+dirStructure[i]);
}
tempSocket.close();
out.println("226 transfer complete");
}
catch(IOException e){}

  LIST 命令用于向客户端返回服务器中工作目录下的目录结构,包括文件和目录的列表。处理这个命令时,先创建一个临时的套接字向客户端发送目录信息。这个套接字的目的端口号缺省为1,然后为当前工作目录创建File 对象,利用该对象的list()方法得到一个包含该目录下所有文件和子目录名称的字符串数组,然后根据名称中是否含有文件名中特有的“.”来区别目录和文件。最后,将得到的名称数组通过临时套接字发送到客户端。



·上一篇教程:java 3D 动画场景编程简介
·下一篇教程:教你在Jave中实现3d编程简介
【发表评论】【告诉好友】【加入收藏】【打印此文】【关闭窗口】

相 关 教 程 

用Java实现FTP服务器..
JavaBeans程序开发从..
Java学习的捷径
谈谈JAVA程序的反编译
学习,是一条漫长的..
教你如何成为一名Ja..
如何迅速成为Java高手
Java编出一个自己的..
如何成为一名Java初..
体验Java 1.5中面向..

热 门 教 程

用Java实现多线程服..
JAVA实现支持视频点..
java 3D 动画场景编..
用Java实现FTP服务器
教你在Jave中实现3d..
用Java设计下载软件
Java中C/S通讯程序设..
Java网络编程之传输..
Java网络编程之传输..
Java网络编程之传输..

最 新 教 程 

用Java实现FTP服务器..
JavaBeans程序开发从..
Java学习的捷径
谈谈JAVA程序的反编译
学习,是一条漫长的..
教你如何成为一名Ja..
如何迅速成为Java高手
Java编出一个自己的..
如何成为一名Java初..
体验Java 1.5中面向..

特 效 代 码

  综合特效  状态栏类
  游戏相关  页面背景
  页面特效  页面导航
  文本操作  文本特效
  图形特效  鼠标特效
  时间日期  密码相关
  浏览相关  警告对话
  技巧特效  计数转换
  测试搜索  代码生成
  播放音乐  按钮特效
  系统相关  链接特效
  黑客性质  相关特效
  窗口特效  其它特效

图 片 素 材

  精美图标  水晶图片
  一般图片  肉质图片
  菌类图片  数码风光
  数码动物  装饰素材
  实物素材  儿童素材
  动物图片  儿童图片
  风光图片  风情图片
  精美佳图  军事图片
  卡通图片  实物图片
  体育图片  植物图片
  装饰图片  桌面壁纸
  3D图片  广告图片
  绘画图片  设计素材
  素材图片  微标图片
  欣赏素材  邮票图片
  资料图片  动物动画
  一般动画  瓜果蔬菜
  观赏图片  花卉图片
  杂类图片  baby图标
  ICON图标  Logo站标
  论坛图标  像素图片