,Java   工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛,Java
您的位置:Yesky > 软件 > 开发者网络 > 正文
用Java实现FTP服务器解决方案
[文章信息]
作者:nankailzq
时间:2005-05-09
出处:Java研究组织
责任编辑:方舟
[文章导读]
根据FTP 的工作原理,在主函数中建立一个服务器套接字端口,等待客户端请求
advertisement
热点推荐
· 图文详解:黑客入侵方式演示
· Java异常处理的陋习展播
· 多媒体系列教程:网页设计制作
· Powerpoint动画演示教程连载
· 光盘刻录手册:禁忌与技巧(下)
[正文]
  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相关内容,Java焦点新闻
  • Java源码分析:深入探讨Iterator模式
  • 菜鸟初学Java的备忘录之第一次接触
  • 浅析Java中Data类的应用
  • 为什么Java中继承多数是有害的
  • 把WebLogic EJB程序迁移到JBoss上
  • FVD刺激高清碟机加速商业化 抢占商机最重要
  • 3家搜索引擎集体诉讼8848 吕春维未敢出席
  • 杨元庆:没有准备不会获批的备用方案
  • 军队信息化诞生新领域 电子军务呼之欲出
  • 世界经济论坛公布信息化程度全球最新排名
  • 2004政务绩效评估:政府门户尚处于发展阶段
  • 甲骨文出资5.15亿美元 意图收购RetekInc
  • 技术并购:帮你突破传统增长的“天花板”
  • ,JavaAdvertisement

    天极无线
    经典名曲 华语流行 欧美风情 人声音效 原声大碟
    你好周杰伦-安又琪
    直线-张韶涵
    天边-张韶涵
    看我72变-蔡依林
    乱世佳人-Twins
    全世界下雨-张娜拉
    我们的爱-飞儿乐队
    分手快乐-梁静茹
    爱在西元前-周杰伦
    三万英尺-迪克牛仔
    爱如潮水-张信哲
    爱情宣言-齐秦
    寻找玛依拉-刀郎
    驼铃-刀郎
    老鼠爱大米-杨臣刚
    功夫主题曲
    仙剑主题曲杀破狼
    天下无贼片尾曲
    冲动的惩罚-刀郎
    情人-刀郎
    爱情-莫文蔚
    挪威的森林-伍佰
    奔跑 - 羽泉
    因为爱 - 羽泉
      ·时尚女人圈
    ·经典影视专集
    ·美女秀场
    ·美丽大自然专题
    ·流行金曲
    ·科幻电影特区
    | 最新推荐
    ·你好周杰伦
    ·杀破狼
    ·寻找玛依拉
    ·孤单公园
    ·男人海洋
    | 魔术铃声
    ·少女丰胸
    ·少妇丰胸
    ·减肥魔铃
    ·增高魔铃
    ·美容魔铃

    今日报价查询 更多报价