`
shihuan830619
  • 浏览: 582869 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

commons-net3的一些应用

    博客分类:
  • J2EE
阅读更多
FTP上传下载的例子:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class TestUploadDownload {

	/**
	* Description: 向FTP服务器上传文件
	* @param url FTP服务器hostname
	* @param port FTP服务器端口
	* @param username FTP登录账号
	* @param password FTP登录密码
	* @param path FTP服务器保存目录
	* @param filename 上传到FTP服务器上的文件名
	* @param input    输入流
	* @return 成功返回true,否则返回false
	*/
	public boolean uploadFile(String url, int port, String username,
			String password, String path, String filename, InputStream input) {
		// 初始表示上传失败
		boolean success = false;
		// 创建FTPClient对象
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			// 连接FTP服务器
			// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.connect(url, port);
			// 登录ftp
			ftp.login(username, password);
			// 看返回的值是不是230,如果是,表示登陆成功
			reply = ftp.getReplyCode();
			// 以2开头的返回值就会为真
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return success;
			}
			// 转到指定上传目录
			ftp.changeWorkingDirectory(path);
			// 将上传文件存储到指定目录
			ftp.storeFile(filename, input);
			// 关闭输入流
			input.close();
			// 退出ftp
			ftp.logout();
			// 表示上传成功
			success = true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return success;
	}
	
	 /**
	* Description: 从FTP服务器下载文件
	* @param url FTP服务器hostname
	* @param port   FTP服务器端口
	* @param username FTP登录账号
	* @param password   FTP登录密码
	* @param remotePath   FTP服务器上的相对路径
	* @param fileName 要下载的文件名
	* @param localPath 下载后保存到本地的路径
	* @return
	*/
	public boolean downFile(String url, int port, String username,
			String password, String remotePath, String fileName,
			String localPath) {
		// 初始表示下载失败
		boolean success = false;
		// 创建FTPClient对象
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			// 连接FTP服务器
			// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.connect(url, port);
			// 登录ftp
			ftp.login(username, password);
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return success;
			} // 转到指定下载目录
			ftp.changeWorkingDirectory(remotePath);
			// 列出该目录下所有文件
			FTPFile[] fs = ftp.listFiles();
			// 遍历所有文件,找到指定的文件
			for (FTPFile ff : fs) {
				if (ff.getName().equals(fileName)) {
					// 根据绝对路径初始化文件
					File localFile = new File(localPath + "/" + ff.getName());
					// 输出流
					OutputStream is = new FileOutputStream(localFile);
					// 下载文件
					ftp.retrieveFile(ff.getName(), is);
					is.close();
				}
			}
			// 退出ftp
			ftp.logout();
			// 下载成功
			success = true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return success;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}


模拟telnet登录的例子:
import java.io.InputStream;
import java.io.PrintStream;

import org.apache.commons.net.telnet.EchoOptionHandler;
import org.apache.commons.net.telnet.SuppressGAOptionHandler;
import org.apache.commons.net.telnet.TelnetClient;
import org.apache.commons.net.telnet.TerminalTypeOptionHandler;

/**
* 使用apache的commons-net包模拟telnet登录
*/
public class TestTelnet {

	private TelnetClient telnet = null;
	private InputStream in;
	private PrintStream out;
	private char prompt = '#';  //linux提示符
	
	/**
	* 登录linux
	* @param server
	* @param user
	* @param password
	*/
	public TestTelnet(String server, String user, String password) {
		try {
			// Connect to the specified server
			telnet = new TelnetClient();
			TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler(
					"VT100", false, false, true, false);
			EchoOptionHandler echoopt = new EchoOptionHandler(true, false,
					true, false);
			SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(true,
					true, true, true);

			telnet.addOptionHandler(ttopt);
			telnet.addOptionHandler(echoopt);
			telnet.addOptionHandler(gaopt);

			telnet.connect(server, 23);

			// Get input and output stream references
			in = telnet.getInputStream();

			out = new PrintStream(telnet.getOutputStream());

			// Log the user on
			readUntil("login: ");
			write(user);

			readUntil("Password: ");
			write(password);

			// Advance to a prompt
			readUntil("$" + " ");

			// readUntil("$" + "su = root");
			// write("su - root");

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 改变当前登录用户
	 * @param user 用户名
	 * @param password 密码
	 * @param serTile linux用户提示符
	 * @return
	 */
	public String suUser(String user, String password, String userTitle) {
		// System.out.println("改变当前用户:");
		write("su - " + user);
		// System.out.println("准备读取返回的流,看是不是可以继续录入密码了:");
		readUntil("密码:");// 有可能不是中文,先用telnet命令测试下
		// System.out.println("返回信息提示可以录入密码,才开始录密码:");
		write(password);
		return readUntil(userTitle + " ");
	}

	/**
	 * 读取流信息
	 * @param pattern 流读取时的结束字符
	 * @return
	 */
	public String readUntil(String pattern) {
		try {
			char lastChar = pattern.charAt(pattern.length() - 1);
			// System.out.println("当前流的字符集:"+new
			// InputStreamReader(in).getEncoding());
			StringBuffer sb = new StringBuffer();
			byte[] buff = new byte[1024];
			int ret_read = 0;
			String str = "";
			do {
				ret_read = in.read(buff);
				if (ret_read > 0) {
					// 把读取流的字符转码,可以在linux机子上用echo $LANG查看系统是什么编码
					String v = new String(buff, 0, ret_read, "UTF-8");
					str = str + v;
					// System.out.println("debug:"+str+"========"+pattern);
					if (str.endsWith(pattern)) {
						// System.out.println("退出:"+str+"========"+pattern);
						break;
					}
				}

			} while (ret_read >= 0);
			return str;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 向流中发送信息
	 * @param value
	 */
	public void write(String value) {
		try {
			out.println(value);
			out.flush();
			System.out.println("录入命令:" + value);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 运行命令,默认linux提示符是'$'
	 * @param command 命令
	 * @return
	 */
	public String sendCommand(String command) {
		try {
			prompt = '$';
			write(command);
			return readUntil(prompt + " ");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 运行命令,默认linux提示符是'$'
	 * @param command 命令
	 * @param userTitle linux提示符
	 * @return
	 */
	public String sendCommand(String command, char userTitle) {
		try {
			prompt = userTitle;
			write(command);
			return readUntil(prompt + " ");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 释放连接
	 */
	public void disconnect() {
		try {
			telnet.disconnect();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			TestTelnet telnet = new TestTelnet("192.168.0.1", "zhsoft", "rootroot");
			// 使用--color=no屏蔽ls命令的颜色,要不会有乱码
			String reStr = telnet.sendCommand("ls --color=no");
			System.out.println(reStr.replaceFirst("ls --color=no", ""));
			telnet.suUser("root", "rootroot", "#");
			String reStr2 = telnet.sendCommand("ls --color=no", '#');
			System.out.println(reStr2.replaceFirst("ls --color=no", ""));
			telnet.disconnect();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


【注】:除了上面两个例子外还可以参考官方包里面带的examples文件夹例子。
分享到:
评论

相关推荐

    commons-net-jar包.zip

    Commons Net还包含了一些日期和时间的处理工具,如InternetDateFormat类,可以按照RFC822和RFC1123标准格式化日期,这在处理HTTP头部或电子邮件时非常有用。 7. **版本差异** 从3.3升级到3.4,主要的改进可能包括...

    commons-net-3.6

    3. **commons-net-examples-3.6.jar**:包含了一些示例代码,演示了如何使用Apache Commons Net库的各种功能。这些例子是学习和快速上手的良好起点,可以帮助开发者快速理解和应用库中的函数。 此外,压缩包中还有...

    commons-net-3.1.jar,3.3,3.6版本

    - 虽然不作为主要功能,但 Commons Net 还提供了一些基础的URL连接和HTTP请求处理功能。 - 新版本可能对HTTP协议的兼容性进行了扩展,或者提升了请求处理的效率。 9. **API稳定性和易用性**: - 随着版本迭代,...

    完美解决:commons-net-1.4.1.jar包中ftp应用的几点问题

    使用commons-net-1.4.1.jar,FTPClient连接成功了,但是ftpClient.listFiles(path).length=0 怎么办? 下载本工具,彻底解决问题。 不要增加类,也不要修改任何代码。 不要犹豫了,干掉commons-net-1.4.1.jar包,用这...

    commons-net-3.6.jar

    《Apache Commons Net 3.6:FTP操作与源码解析》 Apache Commons Net是一个Java库,专注于网络协议的实现,尤其是FTP(文件传输协议)相关的功能。在这个版本中,我们聚焦于`commons-net-3.6.jar`,它提供了丰富的...

    commons-net-3.6 jar包.zip

    本文将深入解析`commons-net-3.6.jar`包,了解其核心功能、使用方法以及在实际开发中的应用。 Apache Commons Net库自1999年以来就一直在为Java开发者提供服务,它的主要目标是提供一套全面且易于使用的API,用于...

    commons-net-ftp-2.0.jar.zip

    《Apache Commons Net FTP库在Java开发中的应用》 Apache Commons Net是一个Java库,它提供了对各种网络协议的支持,其中就包括FTP(File Transfer Protocol)协议。在这个特定的案例中,我们关注的是`commons-...

    commons-net-3.3-3.4-3.5-3.6.zip

    在这个压缩包"commons-net-3.3-3.4-3.5-3.6.zip"中,包含了Apache Commons Net库的四个不同版本:3.3、3.4、3.5和3.6,这使得开发者可以根据项目的具体需求选择适合的版本。 Apache Commons Net库是Apache软件基金...

    commons-net-1.4.1.jar

    在实际应用中,开发者通常会结合Apache Commons Net和其他库,如IOUtils(来自Apache Commons IO)来处理输入/输出流,以实现更高效的文件操作。通过使用这些经过验证和广泛使用的库,开发者可以减少错误和提高代码...

    commons-net-3.3.jar

    《Apache Commons Net 3.3:FTP开发利器详解》 Apache Commons Net库是Apache软件基金会的一个项目,专注于网络协议的实现,尤其是FTP(文件传输协议)相关的功能。在这个3.3版本的jar包中,开发者可以找到一系列...

    commons-dbcp-1.2.1.jar + commons-pool-1.4.jar + commons-collections-3.2.jar

    3. **Apache Commons Collections** `commons-collections-3.2.jar` 是Apache Commons项目下的另一个组件,提供了大量对Java集合框架的扩展和实用工具类。这个库在DBCP中可能用于辅助处理数据结构,例如存储和操作...

    commons-net-3.2.jar

    在本篇文章中,我们将深入探讨"commons-net-3.2.jar"这一版本的功能、特性以及如何在实际项目中应用。 一、概述 Apache Commons Net 3.2是该库的一个稳定版本,它提供了一系列接口和类,以支持各种网络协议的操作...

    commons-fileupload-1.3.3.jar和commons-io-2.6.jar

    在Java开发中,上传文件是一项常见的任务,而`commons-fileupload-1.3.3.jar`和`commons-io-2.6.jar`是Apache Commons项目中的两个重要库,专门用于处理HTTP请求中的文件上传功能。这两个库为开发者提供了便捷、高效...

    jar包-commons-net-3.3.jar

    **标题解析:**"jar包-commons-net-3.3.jar" 这个标题表明我们正在讨论的是一个Java Archive(JAR)文件,名为"commons-net-3.3.jar"。JAR文件是Java平台上的标准归档格式,通常用于打包类库、资源文件以及应用程序...

    commons-dbcp-1.4.jar和commons-pool-1.5.6.jar

    这两个JAR文件,`commons-dbcp-1.4.jar` 和 `commons-pool-1.5.6.jar`,在Java应用中起到了重要的角色,特别是对于那些需要高效管理数据库连接的大型系统。 Apache Commons DBCP是Apache Commons项目的一部分,它...

    commons-beanutils、commons-collections、commons-collections等常用jar 包下载

    3. **Apache Commons Collections4** - `commons-collections4-4.1.jar` 这是Commons Collections的一个新版本,对原有的API进行了优化和改进。主要改进包括: - 与Java 5及更高版本的兼容性:使用泛型、枚举和可...

    commons-beanutils.jar commons-collections-3.1.jar commons-pool-1.2.jar

    这里提到的三个JAR文件——`commons-beanutils.jar`、`commons-collections-3.1.jar`和`commons-pool-1.2.jar`,都是Apache Commons项目的一部分,分别涉及Bean操作、集合操作和对象池化。 **1. `commons-beanutils...

    Android 利用commons-net-3.3实现ftp上传下载Demo

    本教程将深入讲解如何利用Apache Commons Net库的3.3版本在Android应用中实现FTP功能。 首先,Apache Commons Net是一个Java库,提供了一系列用于网络通信的类和实用工具,包括FTP客户端组件。在Android项目中,...

    commons-pool-1.3.jar 和commons-dbcp-1.2.2.jar

    Apache Commons Pool是一个对象池设计模式的实现,它提供了一种在应用程序中高效管理和重用对象的方式。对象池的基本思想是预先创建一定数量的对象,当需要使用时,不再创建新的对象,而是从池中获取已经存在的对象...

    commons-net-1.4.1 和 jakarta-oro-2.0.8 .rar

    标题中的"commons-net-1.4.1"和"jakarta-oro-2.0.8"指的是两个开源Java库,分别由Apache Commons项目和Jakarta项目开发。这两个库在Java编程中扮演着重要的角色,提供了不同的功能和服务。 Apache Commons Net是...

Global site tag (gtag.js) - Google Analytics