当前位置:天才代写 > tutorial > JAVA 教程 > 用Java实现FTP处事器办理方案

用Java实现FTP处事器办理方案

2017-11-13 08:00 星期一 所属: JAVA 教程 浏览:309

副标题#e#

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.");


#p#副标题#e#

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

#p#副标题#e#

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){}
}

#p#分页标题#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()要领获得一个包括该目次下所有文件和子目次名称的字符串数组,然后按照名称中是否含有文件名中特有的“.”来区别目次和文件。最后,将获得的名称数组通过姑且套接字发送到客户端。

 

    关键字:

天才代写-代写联系方式