|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
再说第三点:我并没有提到服务器也要整合,然后是IDE,一个好的IDE能够200%提高开发的速度,就说图形方面:你是经过简单托拽和点击就能实现功能好那。ftp服务器FTP命令
FTP的次要操纵都是基于各类命令基本之上的。经常使用的命令有:
◆设置传输形式,它包含ASCⅡ(文本)和BINARY二进制形式;
◆目次操纵,改动或显现远程盘算机确当前目次(cd、dir/ls命令);
◆毗连操纵,open命令用于创建同远程盘算机的毗连;close命令用于封闭毗连;
◆发送操纵,put命令用于传送文件到远程盘算机;mput命令用于传送多个文件到远程盘算机;
◆猎取操纵,get命令用于吸收一个文件;mget命令用于吸收多个文件。
编程思绪
依据FTP的事情道理,在主函数中创建一个服务器套接字端口,守候客户端哀求,一旦客户端哀求被承受,服务器程序就创建一个服务器分线程,处置客户真个命令。假如客户端必要和服务器端举行文件的传输,则创建一个新的套接字毗连来完成文件的操纵。
编程技能申明
1.主函数计划
在主函数中,完成服务器端口的侦听和服务线程的创立。我们使用一个静态字符串变量initDir来保留服务器线程运转时地点的事情目次。服务器的初始事情目次是由程序运转时用户输出的,缺省为C盘的根目次。
详细的代码以下:
publicclassftpServerextendsThread{
privateSocketsocketClient;
privateintcounter;
privatestaticStringinitDir;
publicstaticvoidmain(String[]args){
if(args.length!=0){
initDir=args[0];
}else{initDir="c:";}
inti=1;
try{
System.out.println("ftpserverstarted!");
//监听21号端口
ServerSockets=newServerSocket(21);
for(;;){
//承受客户端哀求
Socketincoming=s.accept();
//创立服务线程
newftpServer(incoming,i).start();
i++;
}
}catch(Exceptione){}
}
2.线程类的计划
线程类的次要计划都是在run()办法中完成。用run()办法失掉客户真个套接字信息,依据套接字失掉输出流和输入流,向客户端发送接待信息。
3.FTP命令的处置
(1)会见把持命令
◆username(user)和password(pass)命令处置代码以下:
if(str.startsWith("USER")){
user=str.substring(4);
user=user.trim();
out.println("331Password");}
if(str.startsWith("PASS"))
out.println("230User"+user+"loggedin.");
User命令和Password命令分离用来提交客户端用户输出的用户名和口令。
◆CWD(CHANGEWORKINGDIRECTORY)命令处置代码以下:
if(str.startsWith("CWD")){
Stringstr1=str.substring(3);
dir=dir+"/"+str1.trim();
out.println("250CWDcommandsuccesful");
}
该命令改动事情目次到用户指定的目次。
◆CDUP(CHANGETOPARENTDIRECTORY)命令处置代码以下:
if(str.startsWith("CDUP")){
intn=dir.lastIndexOf("/");
dir=dir.substring(0,n);
out.println("250CWDcommandsuccesful");
}
该命令改动以后目次为上一层目次。
◆QUIT命令处置代码以下:
if(str.startsWith("QUIT")){
out.println("GOODBYE");
done=true;
}
该命令加入及封闭与服务器的毗连,输入GOODBYE。
(2)传输参数命令
◆Port命令处置代码以下:
if(str.startsWith("PORT")){
out.println("200PORTcommandsuccessful");
inti=str.length()-1;
intj=str.lastIndexOf(",");
intk=str.lastIndexOf(",",j-1);
Stringstr1,str2;
str1="";
str2="";
for(intl=k+1;lstr1=str2+str.charAt(l);
}
for(intl=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("200typeset");
}
TYPE命令用来完成范例设置。
(3)FTP服务命令
◆RETR(RETEIEVE)和STORE(STORE)命令处置的代码
if(str.startsWith("RETR")){
out.println("150Binarydataconnection");
str=str.substring(4);
str=str.trim();
RandomAccessFileoutFile=new
RandomAccessFile(dir+"/"+str,"r");
SockettempSocket=newSocket(host,tempPort);
OutputStreamoutSocket
=tempSocket.getOutputStream();
bytebyteBuffer[]=newbyte[1024];
intamount;
try{
while((amount=outFile.read(byteBuffer))!=-1){
outSocket.write(byteBuffer,0,amount);
}
outSocket.close();
out.println("226transfercomplete");
outFile.close();
tempSocket.close();
}
catch(IOExceptione){}
}
if(str.startsWith("STOR")){
out.println("150Binarydataconnection");
str=str.substring(4);
str=str.trim();
RandomAccessFileinFile=new
RandomAccessFile(dir+"/"+str,"rw");
SockettempSocket=newSocket(host,tempPort);
InputStreaminSocket
=tempSocket.getInputStream();
bytebyteBuffer[]=newbyte[1024];
intamount;
try{
while((amount=inSocket.read(byteBuffer))!=-1){
inFile.write(byteBuffer,0,amount);
}
inSocket.close();
out.println("226transfercomplete");
inFile.close();
tempSocket.close();
}
catch(IOExceptione){}
}
文件传输命令包含从服务器中取得文件RETR和向服务器中发送文件STOR,这两个命令的处置十分相似。处置RETR命令时,起首失掉用户要取得的文件的称号,依据称号创立一个文件输出流,然后和客户端创建一时套接字毗连,并失掉一个输入流。随后,将文件输出流中的数据读出并借助于套接字输入流发送到客户端,传输终了今后,封闭流和一时套接字。
STOR命令的处置也是一样的历程,只是偏向恰好相反。
◆DELE(DELETE)命令处置代码以下:
if(str.startsWith("DELE")){
str=str.substring(4);
str=str.trim();
Filefile=newFile(dir,str);
booleandel=file.delete();
out.println("250deletecommandsuccessful");
}
DELE命令用于删除服务器上的指定文件。
◆LIST命令处置代码以下:
if(str.startsWith("LIST")){
try{
out.println("150ASCIIdata");
SockettempSocket=newSocket(host,tempPort);
PrintWriterout2=newPrintWriter(tempSocket.getOutputStream(),true);
Filefile=newFile(dir);
String[]dirStructure=newString[10];
dirStructure=file.list();
StringstrType="";
for(inti=0;iif(dirStructure[i].indexOf(".")==-1){
strType="d";}
else
{strType="-";}
out2.println(strType+dirStructure[i]);
}
tempSocket.close();
out.println("226transfercomplete");
}
catch(IOExceptione){}
LIST命令用于向客户端前往服务器中事情目次下的目次布局,包含文件和目次的列表。处置这个命令时,先创立一个一时的套接字向客户端发送目次信息。这个套接字的目标端标语缺省为1,然后为以后事情目次创立File对象,使用该对象的list()办法失掉一个包括该目次下一切文件和子目次称号的字符串数组,然后依据称号中是不是含有文件名中独有的“.”来区分目次和文件。最初,将失掉的称号数组经由过程一时套接字发送到客户端。
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。 |
|