egebxwyrnp 发表于 2016-6-10 12:30:28

FTP 协议(rfc939) 简单的实验(in Java)

  Java代码:
FTPClient.java
package org;
  import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
  public class FtpClient ...{
  public static final int DEFAULT_PORT = 1968;
  private static int print(Reader in) throws IOException ...{
        int c;
        int prev = 0, current = 0;
        int result = 0;
        int count = 0, k1 = 0, k2 = 0, k3 = 0;
        while (prev != ' ' && current != ' ') ...{
            prev = current;
            c = in.read();
            current = c;
            if (count < 3) ...{
                switch (count) ...{
                case 0:
                    k1 = current - '0';
                    break;
                case 1:
                    k2 = current - '0';
                    break;
                case 2:
                    k3 = current - '0';
                    break;
                }
            }
            count++;
            System.out.write(current);
        }
        result = k1 * 100 + k2 * 10 + k3;
        return result;
    }
  private static void printData(Reader in) throws IOException ...{
        int c = 0;
  while ((c = in.read()) != -1) ...{
            System.out.print((char) c);
        }
        System.out.println();
    }
  private static void inputCommand(Writer out, String command) throws IOException ...{
        out.write(command);
        out.write(" \r\n");
        out.flush();
    }
  public static void main(String[] args) ...{
        String hostname = "192.168.1.101";
  Socket commandConn = null;
  Socket dataConn = null;
  try ...{
  commandConn = new Socket(hostname, DEFAULT_PORT);
  Writer out = new OutputStreamWriter(commandConn.getOutputStream(),
                    "8859_1");
  InputStream raw = commandConn.getInputStream();
            BufferedInputStream buffer = new BufferedInputStream(raw);
            InputStreamReader commandIn = new InputStreamReader(buffer,
                    "8859_1");
  System.out.println("login in");
            int i = print(commandIn);// 220
  inputCommand(out, "USER winters");
            System.out.println("USER winters");
            i = print(commandIn);// 331
  inputCommand(out, "PASS 123456");
            System.out.println("PASS 123456");
            i = print(commandIn);// 230
  inputCommand(out, "SYST");
            System.out.println("SYST");
            i = print(commandIn);// 215
  inputCommand(out, "PWD");
            System.out.println("PWD");
            i = print(commandIn);// 257
  inputCommand(out, "TYPE A");
            System.out.println("TYPE A");
            i = print(commandIn);// 200
  inputCommand(out, "PASV");
            System.out.println("PASV");
           
            int port = getPortNumber(commandIn);
            dataConn = new Socket(hostname, port);
            BufferedInputStream dataBuffer = new BufferedInputStream(dataConn
                    .getInputStream());
            InputStreamReader dataIn = new InputStreamReader(dataBuffer,
                    "8859_1");
  System.out.println("Connected " + hostname + " on " + port);
  /** *//**
             * LIST
             */
  inputCommand(out, "LIST");
            System.out.println("LIST");
            System.out.print("commandIn : ");
            i = print(commandIn);// 150
  System.out.print("dataIn : ");
            printData(dataIn);// abc
  i = print(commandIn);// 226
  /** *//** ************************************* */
  inputCommand(out, "PASV");
            System.out.println("PASV");
            port = getPortNumber(commandIn);
  dataConn = new Socket(hostname, port);
            dataBuffer = new BufferedInputStream(dataConn.getInputStream());
            dataIn = new InputStreamReader(dataBuffer, "8859_1");
  System.out.println("Connected " + hostname + " on " + port);
  /** *//**
             * RETR
             */
  inputCommand(out, "RETR 1.txt");
            System.out.println("RETR 1.txt");
  System.out.print("commandIn : ");
            i = print(commandIn);// 150
  System.out.print("dataIn : ");
            printData(dataIn);// abc
  i = print(commandIn);// 226
  } catch (IOException e) ...{
            System.err.println(e);
        } finally ...{
            try ...{
                if (commandConn != null)
                    commandConn.close();
                if (dataConn != null)
                    dataConn.close();
            } catch (IOException e) ...{
                System.err.println(e);
            }
        }
  }
  private static int getPortNumber(InputStreamReader in) throws IOException ...{
        int c;
        int prev = 0, current = 0;
        boolean start = false;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        while (prev != ' ' && current != ' ') ...{
            prev = current;
            c = in.read();
            current = c;
  if (prev == '(')
                start = true;
            if (current == ')')
                start = false;
            if (start)
                out.write(current);
            // System.out.println("==" + out.toString() + "==");
            System.out.write(current);
        }
  String ipWithPort = out.toString();
        StringTokenizer stk = new StringTokenizer(ipWithPort, ",");
        List list = new ArrayList();
        while (stk.hasMoreTokens()) ...{
            list.add(stk.nextToken());
        }
        String[] str = (String[]) list.toArray(new String);
        int a = Integer.parseInt(str);
        int b = Integer.parseInt(str);
        int port = a * 256 + b;
        // System.out.println("debug: port == " + port);
        return port;
    }
}
  
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/starshus/archive/2007/01/01/1471724.aspx
页: [1]
查看完整版本: FTP 协议(rfc939) 简单的实验(in Java)