`
lixinye0123
  • 浏览: 323796 次
  • 性别: Icon_minigender_1
  • 来自: 温州
社区版块
存档分类
最新评论

用Java来实现FTP服务器应用的详细讲解

    博客分类:
  • Java
阅读更多
【编者按】
  根据FTP 的工作原理,在主函数中建立一个服务器套接字端口,等待客户端请求,一旦客户端请求被接受,服务器程序就建立一个服务器分线程,处理客户端的命令。如果客户端需要和服务器端进行文件的传输,则建立一个新的套接字连接来完成文件的操作。
<iframe marginheight="0" scrolling="no" src="http://www.enet.com.cn/enetshow.shtml?Pool=ruanjianflash" marginwidth="0" id="flash1" frameborder="0" height="300" width="360"></iframe>
【正文】
  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 命令用来完成类型设置。
       ◆ 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高级程序设计实验报告-FTP服务器设计与实现.doc

    接着,我们将引导读者进入FTP服务器的设计和实现过程,以及如何应用Java高级编程技术来构建一个强大、稳定和可扩展的FTP服务器。 报告内容包括但不限于以下几个方面: FTP基础知识: 报告会介绍FTP协议的基本原理...

    java开源包4

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    JAVA上百实例源码以及开源项目源代码

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    java开源包3

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包11

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包8

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包6

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包9

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包101

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包5

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包10

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包1

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包2

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包7

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    Java资源包01

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    智能网站服务器多语言集成包AiWnmp v1.014 中秋特别版.zip

    FileZilla_server [小巧的FTP服务器软件] eAccelerator [PHP脚本加速引擎] ZendOptimizer5.6 [PHP脚本加速引擎] ZendLoader6.0 [PHP脚本加速引擎] ZendDebugger6.2 [php开发调试组件] Sendmail [Smtp服务组件] ...

    IIS6.0 IIS,互联网信息服务

    需要注意的是,如果你要用一个IP地址对应多个不同的FTP服务器,则只能用使用不同的端口号的方法来实现,而不支持“主机头名”的做法。 对于已建立好的FTP服务器,在浏览器中访问将使用如“ftp://192.168.0.1”或是...

    java-servlet-api.doc

    Java Servlet API说明文档 绪言 这是一份关于2.1版JavaServletAPI的说明文档,作为对这本文档的补充,你可以到http://java.sun.com/products/servlet/index.html下面下载Javadoc格式的文档。 谁需要读这份文档 这份...

Global site tag (gtag.js) - Google Analytics