`
hcx_2008
  • 浏览: 118013 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

用Java实现FTP服务器解决方案

    博客分类:
  • J2SE
阅读更多
Java研究组织
2005-6-24 23:04:00 文/nankailzq

  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实现FTP服务器解决方案.doc

    用Java实现FTP服务器解决方案.doc

    2022年用Java实现FTP服务器解决方案Java教程.docx

    2022年用Java实现FTP服务器解决方案Java教程.docx

    java实现本地按照FTP服务器上目录结构创建文件夹下载文件

    下载了好多都不好用,最后终于找到好的解决方案,做好demo,下载的同学配置好自己FTP服务器ip,用户名,密码和服务器根目录,下载到本地的位置,完美运行,绝对是好资源,与大家分享。

    java实现本地按照FTP服务器的目录结构创建文件夹下载文件

    下载了好多都不好用,最后终于找到好的解决方案,做好demo,下载的同学配置好自己FTP服务器ip,用户名,密码和服务器根目录,下载到本地的位置,完美运行,绝对是好资源,与大家分享。

    Serv-U,FTP服务器软件,版本号7.2

    FTP服务器用户通过它用FTP协议能在internet上共享文件。Serv-U不仅100%遵从通用FTP标准,也包括众多的独特功能可为每个用户提供文件共享完美解决方案。 Serv-U官方版是一款非常好的FTP服务器软件,它设置简单,功能...

    java开源包4

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

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

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

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

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

    java开源包3

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    Apache Ftpserver

    可移植的FTP服务器引擎解决方案。FtpServer可以作为Windows服务或Unix / Linux守护程序独立运行, 也可以嵌入Java应用程序中。我们还提供对Spring应用程序内集成的支持, 并以OSGi捆绑软件的形式提供我们的发行版...

    java开源包8

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包11

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包6

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包9

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包101

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包5

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包10

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

Global site tag (gtag.js) - Google Analytics