`

Java写的支持断点续传的FTP(转)

    博客分类:
  • Java
阅读更多
public class FileInfo {
	
	public String name;
	public String description;

	public FileInfo(String nm, String dscrp) {
		name = nm;
		description = dscrp;
	}
}

 

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.StringTokenizer;
import java.util.Vector;

public class FTPSearch extends Thread {
	String _host;
	static final int PORT = 21;
	ServerSocket ss;
	Socket _ds;
	Socket _sc;
	PrintStream _out;
	String _hostAddress;
	BufferedReader _in;
	BufferedReader _dataIn;
	String _reply;
	protected StringBuffer _log = new StringBuffer(10000);
	Vector _result;
	String _user;
	String _pass;

	public FTPSearch(String ip, String user, String pass) {
		_host = ip;
		_user = user;
		_pass = pass;
		_result = new Vector();
	}

	public FTPSearch(String ip) {
		_host = ip;
		_user = "anonymous";
		_pass = "name_zm@sohu.com";
		_result = new Vector();
	}

	protected boolean login() throws UnknownHostException, IOException {
		boolean successful = false;
		StringBuffer reply = new StringBuffer();
		_sc = new Socket(_host, PORT);
		_hostAddress = _sc.getLocalAddress().getHostAddress().replace('.', ',');
		_sc.setSoTimeout(15000);
		_out = new PrintStream(_sc.getOutputStream(), true);
		_in = new BufferedReader(new InputStreamReader(_sc.getInputStream()));
		reply.append(readReply().trim());
		if (reply.toString().startsWith("220"))
			if (comm("USER " + _user))
				if (comm("PASS " + _pass))
					successful = true;
		comm("TYPE A");
		return successful;
	}

	protected String getCurrentDir() throws IOException {
		String currentDir = null;
		if (comm("PWD")) {
			StringTokenizer st = new StringTokenizer(_reply);
			st.nextToken();
			StringBuffer rtDir = new StringBuffer(st.nextToken());
			currentDir = rtDir.substring(1, rtDir.length() - 1);
		}
		return currentDir;
	}

	public void search() throws IOException, InterruptedException {
		try {
			for (int i = 0; i < 5; i++) {
				if (login())
					break;
				System.out.println("Wait 10 seconds to try again...");
				sleep(10000);
			}
			scan();
			logout();
		} catch (IOException ex) {

		} finally {
			PrintStream out = new PrintStream(new FileOutputStream("Log.txt"));
			out.println(_log);
			out.close();
			printResult("result.txt");
		}

	}

	protected void scan() throws IOException {
		Vector fileNames = new Vector();
		tellPort();
		comm("LIST -R");

		// Get data_connection's InputStream.
		try {
			_ds = ss.accept();
			System.out.println(ss.toString());
		} catch (IOException ex) {
			ss.close();
		}
		_dataIn = new BufferedReader(
				new InputStreamReader(_ds.getInputStream()));

		System.out.println("Scanning now.Please waiting......");
		// Read directory content
		try {
			String temp = "";
			do {
				temp = _dataIn.readLine();
				if (temp == null)
					break;
				fileNames.add(temp);

			} while (temp != null);
		} catch (InterruptedIOException ex) {
			System.out.println("Caught InterruptedIOException1:" + ex);
		}

		// Read end infomation
		try {
			do {
				String temp = _in.readLine();
				_log.append(temp + "r");
				System.out.println(temp);
			} while (_in.ready());
		} catch (InterruptedIOException ex) {
			System.out.println("Caught InterruptedIOException2:" + ex);
		}
		_result = fileNames;
	}

	public Vector getResult() {
		return _result;
	}

	public StringBuffer getLog() {
		return _log;
	}

	public static Vector parse() throws FileNotFoundException, IOException {
		Vector result = new Vector();
		FileInputStream fileIn = new FileInputStream("result.txt");
		BufferedReader fReader = new BufferedReader(new InputStreamReader(
				fileIn));
		// int size=fileIn.available();
		// System.out.println(String.valueOf(size));
		String dir = "/";
		System.out.println("Parsing now.Please wait......");
		while (fReader.ready()) {
			String temp = fReader.readLine();
			StringTokenizer tt = new StringTokenizer(temp);

			if (tt.countTokens() == 1) {
				if (temp.startsWith("/"))
					dir = temp.replace(':', ' ').trim() + "/";
				else
					dir = "/" + temp.replace(':', ' ').trim() + "/"; // parseResult
																		// .add(
																		// dir);
																		// continue
																		// ;
			}
			if ((!temp.equals(""))
					&& (temp.startsWith("-") || temp.startsWith("b")
							|| temp.startsWith("c") || temp.startsWith("l"))) {
				for (int i = 0; i < 4; i++)
					tt.nextToken();
				String description = "";
				for (int i = 0; i < 4; i++)
					description = description + tt.nextToken() + " ";
				String cont = "";
				do {
					cont = cont + tt.nextToken() + " ";
				} while (tt.hasMoreTokens());
				result.add(new FileInfo(dir + cont.trim(), description.trim()));
				continue;
			} else if (temp.startsWith("d")) {
				for (int i = 0; i < 4; i++)
					tt.nextToken();
				String description = "";
				for (int i = 0; i < 4; i++)
					description = description + tt.nextToken() + " ";
				String cont = "";
				do {
					cont = cont + tt.nextToken() + " ";
				} while (tt.hasMoreTokens());
				result.add(new FileInfo(dir + cont.trim() + "/", description
						.trim()));
				continue;
			} else if (temp.equals("")) {
				continue;
			}
		}
		return result;
	}

	protected void logout() throws IOException {
		comm("QUIT");
	}

	protected void printResult(String resultFile) throws IOException {
		PrintStream out = new PrintStream(new FileOutputStream(resultFile));
		int len = _result.size();
		for (int i = 0; i < len; i++) {
			out.println(_result.elementAt(i));
		}
		out.close();
	}

	protected boolean comm(String command) throws IOException {
		boolean success = false;
		_out.println(command);
		System.out.println("<COMMAND>" + command);
		_log.append("<COMMAND>" + command + "r");
		_reply = readReply();
		if (command.startsWith("USER")) {
			success = _reply.startsWith("331") ? true : false;
		} else if (command.startsWith("PASS")) {
			success = _reply.startsWith("230") ? true : false;
			try {
				readReply();
			} catch (InterruptedIOException ex) {
			}
		} else if (command.equals("TYPE A")) {
			success = _reply.startsWith("200") ? true : false;
		} else if (command.startsWith("PORT")) {
			success = _reply.startsWith("200") ? true : false;
		} else if (command.startsWith("LIST")) {
			success = _reply.startsWith("150") ? true : false;
		} else if (command.startsWith("NLST")) {
			success = _reply.startsWith("150") ? true : false;
		} else if (command.equals("PWD")) {
			success = _reply.startsWith("257") ? true : false;
		} else if (command.startsWith("STAT")) {
			success = _reply.startsWith("211") ? true : false;
		} else if (command.equals("SYST")) {
			success = _reply.startsWith("215") ? true : false;
		} else if (command.startsWith("SITE")) {
			success = _reply.startsWith("214") ? true : false;
		} else if (command.equals("QUIT")) {
			success = _reply.startsWith("221") ? true : false;
		}
		return success;
	}

	public static void printVector(Vector vct) {
		int size = vct.size();
		for (int i = 0; i < size; i++) {
			System.out.println(vct.elementAt(i));
		}
	}

	protected String readReply() throws IOException, InterruptedIOException {
		StringBuffer reply = new StringBuffer();
		do {
			reply.append(_in.readLine() + "r");
		} while (_in.ready());
		System.out.println(reply);
		_log.append(reply);
		_reply = reply.toString();
		return _reply;
	}

	private int getDataPort() {
		int port = _sc.getLocalPort() + 1;
		return port;
	}

	private void tellPort() throws IOException {

		try {
			int port = getDataPort();
			System.out.println("Get data port:" + port);
			int x = (int) Math.round((port / 256) - 0.5);
			int y = port - x * 256;
			try {
				ss = new ServerSocket(port);
			} catch (IOException ex) {
				System.out
						.println("IOException in Method tellPort() in Class ftpc--"
								+ ex);
			}
			comm("PORT " + _hostAddress + "," + x + "," + y);
		} finally {

		}
	}

	public static void main(String arg[]) {
		try {
			FTPSearch client = new FTPSearch("202.114.2.2");
			client.search();
			client.parse();
		} catch (Exception ex) {
			System.out.println(ex);
		}
	}

}

 

public class demo {   
    public static void main(String arg[]) {   
        try {   
            FTPSearch client = new FTPSearch("192.168.0.1");   
            client.search();   
            java.util.Vector temp = client.parse();   
            int size = temp.size();   
            for (int i = 0; i < size; i++) {   
                FileInfo ttt = ((FileInfo) temp.elementAt(i));   
                System.out.println(ttt.name + " " + ttt.description);   
            }     
        } catch (Exception ex) {   
            System.out.println(ex);   
        }   
    }   
}
 
分享到:
评论

相关推荐

    自己收集的多个Java FTP断点续传的例子源码

    Java写的支持断点续传的FTP--crybaby的博客 (2012年5月21日) Java写的支持断点续传的FTP - 罗索工作室 (2012年5月21日) java实现FTP多线程断点续传,上传下载!_qhghw的空间_百度空间 (2012年5月21日)

    xuchuanftp_java_FTP断点续传_

    标题"XuChuanFTP_Java_FTP断点续传"可能是指一个Java实现的FTP客户端库或者一个示例项目,专注于支持FTP的断点续传功能。这个项目可能是为了帮助开发者更方便地处理大文件的上传任务,尤其是在网络不稳定的情况下。 ...

    java apatche ftp 支持断点续传等

    Java Apache FTP支持断点续传是一项重要的网络编程技术,它使得大文件的传输更加高效和可靠。Apache FTP库为Java开发者提供了丰富的功能,包括主被动模式的切换、断点续传以及错误处理等,大大简化了FTP(File ...

    java实现ftp断点续传Java实用源码整理learns

    在Java编程领域,FTP(File Transfer Protocol)断点续传是一项重要的功能,它允许用户在文件传输中断后从上次停止的地方继续,这对于处理大文件或网络不稳定情况下的文件传输非常有用。本文将深入探讨如何使用Java...

    java ftp 多线程 断点续传等知识

    而"多线程"和"断点"这两个文件名可能是指相关示例代码或文档,可以进一步帮助你理解和实践Java FTP的多线程下载和断点续传。 在实际应用中,还需要考虑其他因素,如错误处理、网络状况的监控、文件完整性检查等。...

    Java上传文件到FTP服务器,支持断点续传.rar

    java实现ftp断点续传,上传文件到FTP服务器,支持断点续传,同时支持LINUX主机,代码里面包括了比较多的java网络操作类,比如连接FTP的常规类、递归创建远程服务器目录 上传文件到服务器,新上传和断点续传操作,远程...

    java实现FTP多线程断点续传

    ### Java实现FTP多线程断点续传:深入解析与技术要点 在现代软件开发中,数据传输是一项基本且关键的任务,特别是在处理大文件时,断点续传功能显得尤为重要。断点续传允许在网络连接中断后恢复传输,避免了重新...

    FTP断点续传

    下面是一个简单的示例代码片段,展示如何使用Java实现FTP断点续传的基本流程: ```java import org.apache.commons.net.ftp.FTPClient; public class FtpClientExample { public static void main(String[] args)...

    java大文件分块上传断点续传demo

    本示例"java大文件分块上传断点续传demo"提供了一个完整的解决方案,它允许用户将大文件分块上传,并在上传过程中支持断点续传。 首先,理解"分块上传"的概念。分块上传是将一个大文件分割成多个小块,然后逐个上传...

    java FTP多线程 批量 断点续传

    Java FTP多线程批量断点续传是一种在Java编程中实现高效、稳定文件传输的方法,尤其适用于大文件的上传和下载。在这个过程中,我们利用FTP(File Transfer Protocol)协议,结合多线程技术和断点续传功能,可以显著...

    java实现ftp断点续传

    Java实现FTP断点续传是一项在开发中常遇到的需求,主要应用于大文件传输或网络不稳定时确保文件完整传输。FTP(File Transfer Protocol)是互联网上用于文件传输的标准协议,而断点续传则是FTP的一个重要特性,允许...

    java断点续传

    Java断点续传技术在实际应用中广泛用于文件上传和下载工具,如迅雷、FTP客户端等,它有效地解决了大文件传输过程中的网络问题,提高了用户体验。了解并掌握这种技术对于开发高效的网络应用至关重要。

    ftp.rar_FTP 断点续传_Java FTP上传_ftp 断点_ftp断点续传Java_java ftp

    在这个Java FTP项目中,我们关注的是如何实现FTP的断点续传功能,以及如何利用Java进行多线程FTP上传。 断点续传是FTP的一个重要特性,它允许在文件传输中断后从上次停止的地方继续,而不是重新开始整个文件的传输...

    java实现FTP断点续传

    Java 实现 FTP 断点续传是一项常见的网络编程任务,主要应用于大文件传输,以提高文件上传或下载的效率和可靠性。FTP(File Transfer Protocol)是互联网上用于在不同计算机之间传输文件的标准协议。断点续传允许在...

    java ftp 上传 下载 断点续传

    Java FTP(File Transfer Protocol)是Java编程中用于与FTP服务器交互的一种技术,它允许程序员编写应用程序来上传、下载文件,并实现断点续传功能。在本文中,我们将深入探讨Java FTP上传、下载以及断点续传的核心...

    FTPClient上传下载(支持断点续传)

    `FtpHelper`类中的`download`方法实现了从FTP服务器下载文件的功能,且支持断点续传。该方法首先设置FTPClient的工作模式为被动模式,并将文件传输类型设置为二进制,这是为了确保文件数据的完整性和准确性。接下来...

    java写的ftp客户端,实现断点续传的上传、下载

    功能:断点续传的上传、下载。 运行:TestContinueFtp。 jar包:commons-net-1.4.0.jar 默认为主动模式,占用端口为1080。 备注:含jar包。

    java断点续传源代码

    综上所述,Java断点续传技术涉及网络编程、文件操作和异常处理等多个方面,通过合理的实现可以显著提高大文件下载的效率和用户体验。理解并掌握这些知识点对于开发高效的文件下载应用至关重要。

    java_apache_ftp断点续传(资料及实例)

    Java Apache FTP断点续传是一种在Java编程中实现FTP(文件传输协议)功能的重要技术,特别是在大文件传输时,能够提高效率并节省网络资源。Apache Commons Net是Java库,提供了丰富的FTP客户端功能,包括断点续传。...

Global site tag (gtag.js) - Google Analytics