`

FTP客户端

阅读更多

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 一个完整功能的FTP客户端类,其实就根据ftp协议,用套接字实现通信
 */
public class FtpClient {
	private static final int ALL_INFO = 0;
//	private static final int HINT_INFO = 1;
//	private static final int ERROR_INFO = 2;
	
	private Socket ftpClient;
	private OutputStreamWriter sockWrite;
	private InputStreamReader sockRead;
	private String strRead;
	private int RetCode;
	private int igrade = ALL_INFO;

	public FtpClient() {
	}

	public void setInfoGrade(int igrade) {
		this.igrade = igrade;
	}
	
	/**
	 * 登录FTP服务器
	 * @param UserName
	 * @param Password
	 * @return
	 */
	public boolean Login(String UserName, String Password) {
		//if (SendCommand(""))
			 if (SendCommand("USER " + UserName))
				if (SendCommand("PASS " + Password))
					return true;
		return false;
	}

	/**
	 * 连接FTP服务器
	 * @param IP
	 * @param Port
	 * @return
	 */
	public boolean Connect(String IP, int Port) {

		try {
			ftpClient = new Socket(IP, Port, true);
			if (ftpClient.isConnected() == false) 
				return false;
		} catch (IOException ex) {
			ex.printStackTrace();
			return false;
		}

		try {
			OutputStream os = ftpClient.getOutputStream();
			sockWrite = new OutputStreamWriter(os);
			InputStream is = ftpClient.getInputStream();
			sockRead = new InputStreamReader(is);
		} catch (IOException ex) {
			ex.printStackTrace();
			return false;
		}
		return true;
	}

	/**
	 * 重新发送命令,复位
	 * @return
	 */
	public boolean CanResume() {
		if (SendCommand("REST 100")) {
			PrintInfo("Ftp can Resume to Send!");
			return true;
		}
		PrintInfo("System can not Resume Send!");
		return false;
	}

	/**
	 * 把FTP服务器上的文件读取到本地
	 * @param LocalFile 本地文件名
	 * @param RemFile   FTP上的文件名
	 * @return
	 */
	public boolean DownFile(String LocalFile, String RemFile) {
		//this not user pasv mode to translate the data.
		FileOutputStream OutFile;
		File DescFile = new File(LocalFile);
		long FileLen = 0;
		if (CanResume()) {
			if (DescFile.exists())
				FileLen = DescFile.length();
			else
				try {
					DescFile.deleteOnExit();//delete old the file,then create
					// new.
					DescFile.createNewFile();
				} catch (IOException ex6) {
				}
			SendCommand("REST " + String.valueOf(FileLen));
		}
		try {
			OutFile = new FileOutputStream(DescFile, true);
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
			return false;
		}		
		
		return DownStream(OutFile, RemFile);
	}

	/**
	 * 从FTP服务器上读取文件,存为文件输出流,输出
	 */
	public boolean DownStream(OutputStream outs, String RemFile) {
		ServerSocket SvrSocket;
		if (!SendCommand("TYPE I"))
			return false;
		InetAddress Addr = ftpClient.getLocalAddress();
		String strAddr = Addr.getHostAddress();
		try {
			SvrSocket = new ServerSocket(0);
		} catch (IOException ex1) {
			ex1.printStackTrace();
			return false;
		}
		int RecvPort = SvrSocket.getLocalPort();
		strAddr = strAddr.replace('.', ',');
		int T1 = RecvPort / 256;
		int T2 = RecvPort % 256;
		strAddr += "," + String.valueOf(T1) + "," + String.valueOf(T2);

		if (!SendCommand("PORT " + strAddr))
			return false;
		if (!SendCommand("RETR " + RemFile))
			return false;

		Socket RecvSock;
		try {
			RecvSock = SvrSocket.accept();
		}
		catch (IOException ex2) {
			ex2.printStackTrace();
			return false;
		}
		
		InputStream ins;
		try {
			ins = RecvSock.getInputStream();
			
			byte buff[] = new byte[1024];
			int iRead = 1;
			while (iRead > 0) {
				iRead = ins.read(buff);	
				if (iRead > 0) {
					outs.write(buff, 0, iRead);
				}
			}
			outs.flush();
			outs.close();
			ins.close();
			RecvSock.close();
			SvrSocket.close();
		} catch (IOException ex3) {
			ex3.printStackTrace();
			return false;
		} 		
		
		return true;
	}
	
	/**
	 * 关闭FTP连接
	 *
	 */
	public void DisConnect() {
		try {
			SendCommand("QUIT");
			sockWrite.close();
			sockRead.close();
			ftpClient.close();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * 发送FTP命令
	 * @param Cmd
	 * @return
	 */
	public boolean SendCommand(String Cmd) {
		if (!WriteStr(Cmd + "\r\n"))
			return false;
		if (!ReadStr())
			return false;
		if (RetCode >= 400)
			return false;
		return true;
	}

	/**
	 * 通过Socket接收响应值用
	 * @return
	 */
	public boolean ReadStr() {
		int Len;
		char[] ReadBuff = new char[1024];		
		try {
			Len = sockRead.read(ReadBuff);
		} catch (IOException ex) {
			return false;
		}
		strRead = String.valueOf(ReadBuff, 0, Len - 2);//off the \r\n
		
//		String sCode = strRead.substring(0, 3);
		//前三位为状态码
		//修改,如果返回信息分成几次发送回来就有可能没有状态编码
		try {
			RetCode = Integer.parseInt(strRead.substring(0, 3));
		} catch(Exception e) {
			RetCode = 0;
		}
		PrintInfo(strRead);
		return strRead.length() > 0;
	}

	/**
	 * 通过Socket发送FTP命令用
	 * @param Write
	 * @return
	 */
	public boolean WriteStr(String Write) {
		char[] Arr = Write.toCharArray();
		try {
			sockWrite.write(Arr);
			sockWrite.flush();//user the flush,than you can do the next.! OK
			PrintInfo(Write);
		} catch (IOException ex) {
			ex.printStackTrace();
			return false;
		}
		return true;
	}

	/**
	 * 把客户端的文件上传到FTP服务器上
	 * @param LocalFile
	 * @param RemFile
	 * @param Pasv
	 * @return
	 */
	public boolean PutFile(String LocalFile, String RemFile) {
		File LFile = new File(LocalFile);
		long Len = LFile.length();
		PrintInfo("System Len=" + Len);
		FileInputStream ReadFile;
		try {
			ReadFile = new FileInputStream(LocalFile);
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
			return false;
		}
		
		return PutStream(ReadFile, RemFile);
	}

	/**
	 * 把文件流从外部上传到FTP服务器上,存为文件名为RemFile的文件
	 * @param InStream
	 * @param RemFile
	 * @return
	 */
	public boolean PutStream(InputStream InStream, String RemFile) {
		ServerSocket SvrSocket;
		if (!SendCommand("TYPE I")){
			return false;
	    }
			
		InetAddress Addr = ftpClient.getLocalAddress();
		String strAddr = Addr.getHostAddress();
		strAddr = strAddr.replace('.', ',');
		try {
			SvrSocket = new ServerSocket(0);
		} catch (IOException ex1) {
			ex1.printStackTrace();
			return false;
		}
		int RecvPort = SvrSocket.getLocalPort();
		int T1 = RecvPort / 256;
		int T2 = RecvPort % 256;
		strAddr += "," + String.valueOf(T1) + "," + String.valueOf(T2);
		boolean bport = SendCommand("PORT " + strAddr);
		if (!bport){
			System.out.println("...........port::"+strAddr+"   "+bport);
			return false;
		}
		boolean bstor = SendCommand("STOR " + RemFile);
		if (!bstor){
			System.out.println("...........STOR::"+RemFile+"   "+bstor);
			return false;
		}
			

		Socket RecvSock;
		DataOutputStream writer;
		try {
			RecvSock = SvrSocket.accept();
			writer = new DataOutputStream(RecvSock.getOutputStream());
		} catch (IOException ex2) {
			ex2.printStackTrace();
			return false;
		}

		byte Buff[] = new byte[1024];
		int iRead = 1;
		try {
			while (iRead > 0) {
				iRead = InStream.read(Buff);			
				if (iRead > 0) {
					writer.write(Buff, 0, iRead);
				}
			}
			writer.flush();
			writer.close();
			InStream.close();
			RecvSock.close();
			SvrSocket.close();
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}

		//if (!SendCommand(""))
			//return false;
		PrintInfo("up load the file finish!");
		return true;		
	}
	
	/**
	 * 设置FTP中的路径
	 * @param Dir
	 * @return
	 */
	public boolean SetCurDir(String Dir) {
		return SendCommand("CWD " + Dir);
	}

	/**
	 * 获取FTP中的当前路径
	 * @return
	 */
	public String GetCurDir() {
		if (!SendCommand("PWD "))
			return null;
		else {
			int Pos = strRead.indexOf("\"");
			int Pos2 = strRead.indexOf("\"", Pos + 1);
			String Dir = strRead.substring(Pos + 1, Pos2);
			return Dir;
		}
	}

	/**
	 * 在FTP主目录中创建目录
	 * @param Dir
	 * @return
	 */
	public boolean MkDir(String Dir) {
		if (SendCommand("MKD " + Dir))
			return true;
		else{
			System.out.println("........MKDIR FAILD!");
			return false;
		}
			
	}

	/**
	 * 删除FTP上的目录
	 * @param Dir
	 * @return
	 */
	public boolean RmDir(String Dir) {
		if (SendCommand("RMD " + Dir))
			return true;
		else
			return false;

	}

	/**
	 * 修改FTP上的文件名
	 * @param Old
	 * @param New
	 * @return
	 */
	public boolean ReName(String Old, String New) {
		if (SendCommand("RNFR " + Old))
			return SendCommand("RNTO " + New);
		return false;
	}

	/**
	 * 删除FTP上的文件
	 * @param File
	 * @return
	 */
	public boolean DelFile(String File) {
		return SendCommand("DELE " + File);
	}

	/**
	 * 显示FTP主目录上的文件目录和文件名称
	 * @param ListCmd
	 * @return
	 */
	public String[] ListFile(String ListCmd) {
		StringBuffer sbDir = new StringBuffer();
		ServerSocket SvrSocket;
		if (!SendCommand("TYPE A"))
			return null;
		InetAddress Addr = ftpClient.getLocalAddress();
		String strAddr = Addr.getHostAddress();
		try {
			SvrSocket = new ServerSocket(0);
		} catch (IOException ex1) {
			ex1.printStackTrace();
			return null;
		}
		int RecvPort = SvrSocket.getLocalPort();
		strAddr = strAddr.replace('.', ',');
		int T1 = RecvPort / 256;
		int T2 = RecvPort % 256;
		strAddr += "," + String.valueOf(T1) + "," + String.valueOf(T2);

		Socket RecvSock;
		if (!SendCommand("PORT " + strAddr))
			return null;
		SendCommand("LIST " + ListCmd);
		try {
			RecvSock = SvrSocket.accept();
		} catch (IOException ex2) {
			ex2.printStackTrace();
			return null;
		}
		DataInputStream dataRead;
		try {
			dataRead = new DataInputStream(RecvSock.getInputStream());
		} catch (IOException ex3) {
			ex3.printStackTrace();
			return null;
		}
		byte Buff[] = new byte[1024];
		int iRead = 1;
		try {
			while (iRead > 0) {
				iRead = dataRead.read(Buff);
				if (iRead > 0) {
					sbDir.append(new String(Buff, 0, iRead));
				}				
			}
			dataRead.close();
			RecvSock.close();
			SvrSocket.close();
		} catch (IOException ex4) {
			ex4.printStackTrace();
			return null;
		}
		if (!SendCommand("NOOP"))
			return null;
		return (sbDir.toString()).split("\r\n");
	}
	
	/**
	 * 设置信息输出级别
	 * 0:输出所有信息
	 * 1:只输出提示信息
	 * 2:只输出错误信息
	 */
	private void PrintInfo(String sInfo) {
		if (igrade == 0) {
			System.out.println(sInfo);
		}
	}
}
 
分享到:
评论

相关推荐

    一个FTP客户端

    这是一个FTP客户端,具有FTP客户常见的功能。如果用本FTP客户端登录某个FTP服务器,则先必须申请一个FTP空间,申请FTP空间时,它会给你一个FTP主机地址、用户名称、用户密码。 测试步骤: 1、项目编译并运行。 2、...

    基于lwip的ftp客户端代码

    在这个基于 lwip 的 FTP 客户端代码实例中,我们主要关注如何在 ucOS 操作系统环境下,利用 lwip(Lightweight IP)库来实现 FTP 客户端的功能,以便从远程服务器下载更新程序到嵌入式设备的闪存中。 lwip 是一个...

    QT5.0实现FTP客户端

    FTP客户端用于连接到FTP服务器,执行上传、下载、列举目录、改变工作目录等操作。在QT5.0中实现FTP客户端,主要涉及以下知识点: 1. **QNetworkAccessManager**:这是QT5的核心类,用于处理所有类型的网络请求。...

    FTP客户端C源码(Linux版)

    在这个场景中,我们讨论的是一个基于C语言编写的Linux版本FTP客户端源代码。这个客户端是多年前作为编程练习而创建的,具备基本的FTP命令功能,支持主动模式(PORT)和被动模式(PASV)连接。 **FTP客户端基础** ...

    FTP客户端绿色版安装包

    FTP客户端绿色版安装包是一种无需正式安装即可使用的文件传输协议(FTP)客户端工具。FTP是Internet上用于在不同计算机之间交换文件的标准协议,而“绿色版”指的是这种软件不需通过传统的安装步骤,只需解压即可...

    FTP客户端的编码

    FTP 客户端的编码 FTP 客户端是指可以与 FTP 服务器进行交互的客户端应用程序,通过 FTP 协议,用户可以上传、下载文件、创建目录、删除文件等。FTP 客户端的编码是指使用某种编程语言来实现 FTP 客户端的开发过程...

    ftp客户端,QT4.8.6实现

    FTP客户端是网络上进行文件传输的一种标准协议,它允许用户从远程服务器上获取或向其发送文件。在本项目中,我们关注的是使用QT 4.8.6框架实现的FTP客户端。QT是一个流行的跨平台应用程序开发框架,支持C++语言,...

    java ftp客户端,服务端

    Java作为一种通用的、面向对象的编程语言,提供了丰富的库来支持FTP客户端和服务端的实现。 在Java中,我们可以使用`java.net.Socket`类来创建客户端连接,它代表了两台机器之间的网络连接。Socket编程是基于TCP/IP...

    FTP客户端代码_ftp客户端_

    FTP客户端是实现FTP协议的应用程序,允许用户连接到FTP服务器并执行上传、下载和其他相关操作。在这个场景中,我们讨论的是一个实现了FTP客户端功能的代码库。 FTP客户端的核心功能包括: 1. **连接与认证**:...

    FTP客户端(有源码并已封装成单独的类)

    FTP客户端是一种用于与远程服务器进行文件传输的应用程序,它基于FTP(File Transfer Protocol)协议,允许用户上传、下载、管理远程服务器上的文件。在给定的压缩包中,包含了一个已经封装好的FTP客户端类,这使得...

    C#.NET构建FTP客户端,上传下载

    FTP是互联网上用于在不同计算机之间交换文件的标准协议,而FTP客户端则是与FTP服务器交互的软件工具。 FTP客户端的核心功能包括: 1. **连接与断开**:客户端需要能够连接到指定的FTP服务器,通常通过提供服务器的...

    一个FTP客户端源码

    FTP客户端是网络应用程序的一种,主要用于通过FTP(File Transfer Protocol,文件传输协议)协议与远程服务器进行文件的上传和下载操作。在本项目中,我们有一个名为"FTP.cpp"的源码文件,它构成了FTP客户端的核心...

    免费FTP客户端软件

    汉化免费FTP客户端软件汉化免费FTP客户端软件汉化免费FTP客户端软件汉化免费FTP客户端软件汉化免费FTP客户端软件汉化免费FTP客户端软件汉化免费FTP客户端软件汉化免费FTP客户端软件汉化免费FTP客户端软件汉化免费FTP...

    基于Java的FTP客户端源代码

    Java FTP客户端源代码是用于通过Java编程语言与FTP(文件传输协议)服务器进行交互的程序。FTP是一种在互联网上常用的标准文件传输协议,允许用户上传、下载和管理远程服务器上的文件。Java提供了一系列的API,如`...

    课程设计基于GUI的FTP客户端JAVA源码

    1.实现一个图形用户界面的FTP客户端。 2.功能: 2.1 配置使用IIS的FTP服务器; 2.2 客户端发出各种操作命令;至少实现conn(连接)、list(列示文件)、retr(下载)、store(上载)的功能。 2.3 接收服务器的...

    FTP客户端的JAVA代码---网络课程设计

    1.实现一个图形用户界面的FTP客户端。 2.功能: 2.1 配置使用IIS的FTP服务器; 2.2 客户端发出各种操作命令;至少实现conn(连接)、list(列示文件)、retr(下载)、store(上载)的功能。 2.3 接收服务器的操作...

    VC++实现ftp客户端

    在本文中,我们将深入探讨如何使用VC++来实现一个FTP客户端。FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的标准协议。通过FTP客户端,用户可以连接到远程服务器,执行文件的上传、下载以及目录的...

    QT5.7ftp客户端包含单文件上传下载及服务器文件删除

    QT5.7 FTP客户端是一个基于Qt库开发的用于FTP文件传输的应用程序,它支持基本的FTP操作,如单个文件的上传和下载,以及服务器端文件的删除功能。这个项目可能是一个独立的、轻量级的工具,适用于需要快速进行FTP操作...

    VC++ FTP 客户端 // VC++ FTP 客户端

    在Windows操作系统中,使用C++编程语言开发FTP客户端是一项常见的任务,尤其对于那些需要高度定制功能或高效性能的应用来说。VC++(Visual C++)是微软提供的一个强大的C++开发工具集,它包含了一个集成开发环境...

    QT实现FTP客户端,QT5 VS编译QFtp

    在本项目中,“QT实现FTP客户端,QT5 VS编译QFtp”指的是使用QT5库开发一个FTP(文件传输协议)客户端,并在Visual Studio(VS)环境下进行编译。FTP客户端是能够连接到FTP服务器并执行文件上传、下载和管理操作的...

Global site tag (gtag.js) - Google Analytics