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

📄 ftpclient.java

📁 这是《Java案例精粹150例(上册)》一书配套的源代码。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import java.net.*;
import java.io.*;
import java.util.*;

class FtpClient {
    static final boolean debug = false;
    public static final int FTP_PORT = 21;  // ftp的端口
    static int FTP_SUCCESS = 1;
    static int FTP_TRY_AGAIN = 2;
    static int FTP_ERROR = 3;
    // 数据传输套接字
    private Socket  dataSocket = null;
    private boolean replyPending = false;
    private boolean binaryMode = false;
    private boolean passiveMode = false;
    String user = null;  // 登录用的用户名
    String password = null;  // 登录用的密码
    String command;  // 最近一次命令
    int lastReplyCode;  // 最近的响应信息
    public String welcomeMsg; // 服务器的欢迎信息
    // 从服务器返回的响应字符串对象
    protected Vector serverResponse = new Vector(1);
    protected Socket serverSocket = null; // 与服务器通信的套接字
    public PrintWriter  serverOutput;  
    public InputStream  serverInput;  // 从服务器读取响应的缓冲流

    /** 返回服务器连接的状态 */
    public boolean serverIsOpen() {
        return serverSocket != null;
    }

	/** 设置为被动模式 */
	public void setPassive(boolean mode) {
		passiveMode = mode;
	}
	
	/** 读取服务器的响应信息 */
    public int readServerResponse() throws IOException {
        StringBuffer replyBuf = new StringBuffer(32);
        int c;
        int continuingCode = -1;
        int code = -1;
        String response;
        if (debug) System.out.println("readServerResponse start");
        try{
        while (true) {
            if (debug) System.out.println("readServerResponse outer while loop: "+ serverInput.available());    
            while ((c = serverInput.read()) != -1) {
               if (c == '\r') {
                    if ((c = serverInput.read()) != '\n')
                        replyBuf.append('\r');
                }
                replyBuf.append((char)c);               
                if (c == '\n')
                    break;                
            }
            if (debug) System.out.println("Now past inner while loop");
            response = replyBuf.toString();
            replyBuf.setLength(0);
            if (debug) {
                System.out.print(response);
            }
            try {
                code = Integer.parseInt(response.substring(0, 3));
            } catch (NumberFormatException e) {
                code = -1;
            } catch (StringIndexOutOfBoundsException e) {
                // 此行不存在响应码,循环跳到下一次
                continue;
            }
            serverResponse.addElement(response);
            if (continuingCode != -1) {
                /* we've seen a XXX- sequence */
                if (code != continuingCode ||
                    (response.length() >= 4 && response.charAt(3) == '-')) {
                    continue;
                } else {
                    continuingCode = -1; // 到达程序的结尾
                    break;
                }
            } else if (response.length() >= 4 && response.charAt(3) == '-') {
                continuingCode = code;
                continue;
            } else {
                break;
            }
        }
        }catch(Exception e){e.printStackTrace();}
        if (debug) System.out.println("readServerResponse done");
        return lastReplyCode = code;
    }

    /** 发送命令 <i>cmd</i> 给服务器 */
    public void sendServer(String cmd) {
        if (debug) System.out.println("sendServer start");
        serverOutput.println(cmd);
        if (debug) System.out.println("sendServer done");

    }
   
    /** 返回服务器的所有响应字符串 */
    public String getResponseString() {
        String s = new String();
        for(int i = 0;i < serverResponse.size();i++) {
           s+=serverResponse.elementAt(i);
        }
        serverResponse = new Vector(1);
        return s;
    }

    /** 获取响应字符串 */
   public String getResponseStringNoReset() {
        String s = new String();
        for(int i = 0;i < serverResponse.size();i++) {
           s+=serverResponse.elementAt(i);
        }
        return s;
    }
   
    /** 发送 QUIT 命令给服务器并关闭连接 */
    public void closeServer() throws IOException {
        if (serverIsOpen()) {
            issueCommand("QUIT");
        if (! serverIsOpen()) {
              return;
            }
            serverSocket.close();
            serverSocket = null;
            serverInput = null;
            serverOutput = null;
        }
    }

    protected int issueCommand(String cmd) throws IOException {
        command = cmd;
        int reply;
        if (debug) System.out.println(cmd);
        if (replyPending) {
            if (debug) System.out.println("replyPending");
            if (readReply() == FTP_ERROR)
                System.out.print("Error reading pending reply\n");
        }
        replyPending = false;
        do {
            sendServer(cmd);
            reply = readReply();
            if (debug) System.out.println("in while loop of issueCommand method");
        } while (reply == FTP_TRY_AGAIN);
        return reply;
    }

    // 检测命令
    protected void issueCommandCheck(String cmd) throws IOException {
        if (debug) System.out.println("issueCommandCheck");
        if (issueCommand(cmd) != FTP_SUCCESS) {            
            throw new FtpProtocolException(cmd);
            }
    }

    /** 读取返回数据 */
    protected int readReply() throws IOException {
		lastReplyCode = readServerResponse();
		switch (lastReplyCode / 100) {
		case 1:
			replyPending = true;

		case 2:// 这个case用来以后扩展功能

		case 3:
			return FTP_SUCCESS;

		case 5:
			if (lastReplyCode == 530) {
				if (user == null) {
					throw new FtpLoginException("Not logged in");
				}
				return FTP_ERROR;
			}
			if (lastReplyCode == 550) {
				if (!command.startsWith("PASS"))
					throw new FileNotFoundException(command);
				else
					throw new FtpLoginException("Error: Wrong Password!");
			}
		}
		return FTP_ERROR;
	}

	// 打开数据连接
	protected Socket openDataConnection(String cmd) throws IOException {
		ServerSocket portSocket = null;
		String portCmd;
		InetAddress myAddress = InetAddress.getLocalHost();
		byte addr[] = myAddress.getAddress();
		int shift;
		String ipaddress;
		int port = 0;
		IOException e;
		if (this.passiveMode) {
			// 首先尝试被动模式传输
			try { 
				getResponseString();
				if (issueCommand("PASV") == FTP_ERROR) {
					e = new FtpProtocolException("PASV");
					throw e;
				}
				String reply = getResponseStringNoReset();
				reply = reply.substring(reply.lastIndexOf("(") + 1, reply
						.lastIndexOf(")"));
				StringTokenizer st = new StringTokenizer(reply, ",");
				String[] nums = new String[6];
				int i = 0;
				while (st.hasMoreElements()) {
					try {
						nums[i] = st.nextToken();
						i++;
					} catch (Exception a) {
						a.printStackTrace();
					}
				}
				ipaddress = nums[0] + "." + nums[1] + "." + nums[2] + "."
						+ nums[3];
				try {
					int firstbits = Integer.parseInt(nums[4]) << 8;
					int lastbits = Integer.parseInt(nums[5]);
					port = firstbits + lastbits;
				} catch (Exception b) {
					b.printStackTrace();
				}
				if ((ipaddress != null) && (port != 0)) {
					dataSocket = new Socket(ipaddress, port);
				} else {
					e = new FtpProtocolException("PASV");
					throw e;
				}
				if (issueCommand(cmd) == FTP_ERROR) {
					e = new FtpProtocolException(cmd);
					throw e;
				}
			} catch (FtpProtocolException fpe) { 
				portCmd = "PORT ";
				// 附加host地址
				for (int i = 0; i < addr.length; i++) {
					portCmd = portCmd + (addr[i] & 0xFF) + ",";
				}
				try {
					portSocket = new ServerSocket(20000);
					// 附加端口
					portCmd = portCmd
							+ ((portSocket.getLocalPort() >>> 8) & 0xff) + ","
							+ (portSocket.getLocalPort() & 0xff);
					if (issueCommand(portCmd) == FTP_ERROR) {
						e = new FtpProtocolException("PORT");
						throw e;
					}
					if (issueCommand(cmd) == FTP_ERROR) {
						e = new FtpProtocolException(cmd);
						throw e;
					}
					dataSocket = portSocket.accept();
				} finally {
					if (portSocket != null)
						portSocket.close();
				}
				dataSocket = portSocket.accept();
				portSocket.close();
			}
		}
		else { // 端口传送
			portCmd = "PORT ";
			// 附加host地址
			for (int i = 0; i < addr.length; i++) {
				portCmd = portCmd + (addr[i] & 0xFF) + ",";
			}
			try {
				portSocket = new ServerSocket(20000);
				// 附加端口号
				portCmd = portCmd + ((portSocket.getLocalPort() >>> 8) & 0xff)
						+ "," + (portSocket.getLocalPort() & 0xff);
				if (issueCommand(portCmd) == FTP_ERROR) {
					e = new FtpProtocolException("PORT");
					throw e;
				}
				if (issueCommand(cmd) == FTP_ERROR) {
					e = new FtpProtocolException(cmd);
					throw e;
				}
				dataSocket = portSocket.accept();
			} finally {
				if (portSocket != null)
					portSocket.close();

⌨️ 快捷键说明

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