【发布时间】:2013-06-26 15:59:02
【问题描述】:
在使用 URLConnection 类时是否可以设置 FTP 被动或主动模式?我找不到任何关于此的文档,但这是一个非常基本的功能,很难相信它没有实现。
如果不是,我在标准 Java 中还有哪些其他选择?
【问题讨论】:
在使用 URLConnection 类时是否可以设置 FTP 被动或主动模式?我找不到任何关于此的文档,但这是一个非常基本的功能,很难相信它没有实现。
如果不是,我在标准 Java 中还有哪些其他选择?
【问题讨论】:
要使 FTP 完全正常工作,您确实需要使用 Sockets 回退到低级编程。 URLConnection 和 consorts 根本不适合您的需求(不支持进入被动模式)。幸运的是,Apache Commons 已经为您完成了很多 Apache Commons Net FTPClient 风格的工作。要实现您所需要的,只需使用FTPClient#enterLocalPassiveMode() 或FTPClient#enterLocalActiveMode()
【讨论】:
sun.net.ftp.FtpClient#openPassiveDataConnection()(由sun.net.www.protocol.ftp.FtpURLConnection 使用,这是java.net.URLConnection.openConnection() 中ftp://-schemed-URI 的默认处理程序。这似乎有助于PASV 的使用,尽管不是显式的设置它。
URLConnection.openConnection() 的设计目标——它在那里获取一个 URL 并给你一个InputStream。如果任何声称支持 ftp:// URL 的实现在获取流时没有处理 PASV,那么它可能会公正地考虑被破坏。是的,您在编写 FTP 客户端时不会依赖它。但是,如果您正在编写一个应用程序来解析用户碰巧扔给它的任何 URL 的内容,这可能就足够了,并且尽最大努力。知道 Sun 确实 想到了这一点很有用。
今天,我们捕获 TCP/IP 数据包并确认 Android/JAVA/URLConnection 仍然使用 PORT(Active 模式) 进行 FTP。
如果服务器不支持主动模式或网络不支持主动模式,URLConnection 将失败。
【讨论】: