⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commandreceiver.java

📁 FTP客户端 实现了客户端与FTP服务器的连接。可以上传
💻 JAVA
字号:
package cmd;

import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.util.Vector;
import java.io.*;
import ftpclient.Myftp;
import java.util.StringTokenizer;
import java.util.ArrayList;

public final class CommandReceiver {
  private String[] args;
  private CommandArgument a;
  private Socket s,dataSocket;
  private PrintWriter out,dataOut;
  private BufferedReader in,dataIn;
  public static Vector filesname = new Vector();
  public static Vector filesInfo = new Vector();
  private static CommandReceiver cr = new CommandReceiver();
  private ServerSocket serverDataSocket;
  private static String currentDir="./";

  private CommandReceiver() {
    args = new String[2];
  }

  public static CommandReceiver getHandle() {
    return cr;
  }

  public void setCommandArgument(CommandArgument a) {
    this.a = a;
  }

  public void methConnect() {
    args = a.getArguments();
    try{
     s = new Socket(args[0],Integer.parseInt(args[1]));
     out = new PrintWriter(s.getOutputStream());
     in = new BufferedReader(new InputStreamReader(s.getInputStream()));
   }catch(Exception e){
     MessageManager.inforPane.append("与服务器连接超时!");
   }
   getMsgs();
  }

  public void methUser(){
    args = a.getArguments();
    if(out!=null){
      out.println("USER " + args[0]);
      out.flush();
    }
  }
  public void methPass(){
    args=a.getArguments();
    if(out!=null){
      out.println("PASS " + args[0]);
      out.flush();
    }
  }

  public void methList(){
    args = a.getArguments();
    methPort();
    try{
      out.println("List");
      out.flush();
      dataSocket=serverDataSocket.accept();
      serverDataSocket.close();
      dataIn = new BufferedReader(new InputStreamReader(dataSocket.getInputStream()));
      // 读取目录信息
      String ss;
      while ((ss=dataIn.readLine()) != null) {
        //filesname.add(ss);
        ArrayList infos = new ArrayList();
        StringTokenizer st = new StringTokenizer(ss);
        while (st.hasMoreTokens()) {
          infos.add(st.nextToken());
        }
        filesInfo.add(infos);
        filesname.add(infos.get(infos.size()-1));
      }
      dataIn.close();
      dataSocket.close();
    }catch(Exception exc){

    }
  }
  public void methQuit(){
    out.println("QUIT");
    try{
      out.close();
      dataOut.close();
      in.close();
      dataIn.close();
      s.close();
      dataSocket.close();
    }catch(Exception e){
    }
    MessageManager.inforPane.append("与服务器连接已断开!\n");
  }
  public String methGetIp(){
    String cmd="";
    try {
      // 得到自己的地址
      byte[] address = InetAddress.getLocalHost().getAddress();
      // 用适当的端口号构造服务器
      serverDataSocket = new ServerSocket(0, 1);
      serverDataSocket.setSoTimeout(10000);
      // 准备传送PORT命令用的数据
      for (int i = 0; i < 4; ++i)
        cmd = cmd + (address[i] & 0xff) + ",";
      cmd = cmd + ( ( (serverDataSocket.getLocalPort()) / 256) & 0xff)
          + ","
          + (serverDataSocket.getLocalPort() & 0xff);
    }
    catch (Exception e) {
      //MessageManager.inforPane.append("与服务器连接超时!\n");
    }
    return cmd;
  }
  public void methPort(){
    String cmd="PORT ";
    try {
      out.println(cmd+methGetIp());
      out.flush();
    }
    catch (Exception e) {
      //MessageManager.inforPane.append("与服务器连接超时!\n");
    }
  }

  public void methGet() {
    args = a.getArguments();
    String fileName = args[0];
    try {
      methPort();
      out.println("Retr "+args[0]);
      out.flush();
      dataSocket=serverDataSocket.accept();
      serverDataSocket.close();

      InputStream dataIn = dataSocket.getInputStream();
      int n;
      byte[] buffer = new byte[1024];
      // 在客户端上准备接收用的文件
      RandomAccessFile raf=new RandomAccessFile(fileName,"rw");
      while (dataIn.read(buffer)!=-1) {
        raf.write(buffer);
      }
      MessageManager.inforPane.append("文件下载完毕!\n");
      raf.close();
      dataIn.close();
      dataSocket.close();
    }
    catch (Exception e) {
      //e.printStackTrace();
      MessageManager.inforPane.append("接收文件出错!\n");
    }
    getMsgs();
  }
  public void getMsgs() {
    try {
      CtrlListen listener = new CtrlListen(in);
      Thread listenerthread = new Thread(listener);
      listenerthread.start();
    }
    catch (Exception e) {
      //e.printStackTrace();
      MessageManager.inforPane.append("网络连接出错!");
    }
  }

  public void methCwd() {
    args = a.getArguments();
    try {
      out.println("CWD "+args[0]); // CWD命令
      out.flush();

      filesname.removeAllElements();
      filesname.trimToSize();
    }
    catch (Exception e) {

    }
  }

  public void methPut() {
    args = a.getArguments();
    String fileName = args[0];

    try {
      int n;
      byte[] buff = new byte[1024] ;
      RandomAccessFile raf=null;
      // 准备读出客户端上的文件
      try {
        raf = new RandomAccessFile(fileName,"rw");
      }
      catch (Exception e) {
        System.out.println("文件不存在!");
        MessageManager.inforPane.append("文件不存在!");
        return;
      }

      // 准备发送数据的流
      methPort();
      out.println("Stor "+args[0]);
      out.flush();
      dataSocket=serverDataSocket.accept();
      OutputStream outstr = dataSocket.getOutputStream();
      // 读出文件,并利用网络发送给服务器
      byte[]buffer =new byte[1024];
      while (raf.read(buff)!=-1) {
        outstr.write(buff);
      }

      MessageManager.inforPane.append("传送文件成功!");
      dataSocket.close();
      raf.close();
    }
    catch (Exception e) {
      e.printStackTrace();
      MessageManager.inforPane.append("传送文件失败!");
    }
  }

}

class CtrlListen
    implements Runnable {
  BufferedReader ctrlInput = null;
  static boolean first=true;
  // 构造器 指定读取地址
  public CtrlListen(BufferedReader in) {
    ctrlInput = in;
  }

  public void run() {
    while (true) {
      try { // 按行读入并输出到标准输出上
        MessageManager.inforPane.append(ctrlInput.readLine()+"\n");
      }
      catch (Exception e) {
        first=false;
        if(!first){
          //MessageManager.inforPane.append("与服务器连接断开!");
          break;
        }
      }
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -