免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2209 | 回复: 3
打印 上一主题 下一主题

用Java实现FTP服务器解决方案 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-04 14:33 |只看该作者 |倒序浏览
本帖最后由 庸人谷 于 2013-01-04 14:35 编辑

Java实现FTP服务器解决方案


根据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位为一组,使用十进制传输,中间用逗号隔开。


论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
2 [报告]
发表于 2013-01-04 16:51 |只看该作者
都超强啊,我们就可以用这样的知识

论坛徽章:
0
3 [报告]
发表于 2013-01-05 12:17 |只看该作者
回复 2# pitonas


   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
4 [报告]
发表于 2013-06-25 19:35 |只看该作者
庸人谷 发表于 2013-01-05 05:17
回复 2# pitonas

赞啊!支持楼主坚持发啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP