[转帖]用Java实现FTP服务器解决方案_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3636 | 回复: 0   主题: [转帖]用Java实现FTP服务器解决方案        下一篇 
Leon
注册用户
等级:少校
经验:1436
发帖:116
精华:7
注册:2013-1-4
状态:离线
发送短消息息给Leon 加好友    发送短消息息给Leon 发消息
发表于: IP:您无权察看 2013-1-6 10:19:28 | [全部帖] [楼主帖] 楼主

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

FTP 命令

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

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

目录操作,改变或显示远程计算机的当前目录(cddir/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("北京联动北方科技有限公司ASS"北京联动北方科技有限公司)


out.println("230 User "+user+" loggedin."北京联动北方科技有限公司;

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;
}


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

(2) 传输参数命令

Port命令处理代码如下:

if(str.startsWith("北京联动北方科技有限公司ORT")) {
      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);
}


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




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论