【问题标题】:Setting FTP active/passive mode with Java URLConnection使用 Java URLConnection 设置 FTP 主动/被动模式
【发布时间】:2013-06-26 15:59:02
【问题描述】:

在使用 URLConnection 类时是否可以设置 FTP 被动或主动模式?我找不到任何关于此的文档,但这是一个非常基本的功能,很难相信它没有实现。

如果不是,我在标准 Java 中还有哪些其他选择?

【问题讨论】:

    标签: java ftp


    【解决方案1】:

    要使 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 的使用,尽管不是显式的设置它。
    • @DavidBullock 使用“sun.net”包使您的代码依赖于供应商。
    • @Thor 我的意思是,如果您只想通过 'ftp://' URL 获取数据,那么如果您只需要随意的 ',Sun/Oracle JVM 可能已经足够了尽你所能'的行为。但是,是的,它没有记录,因此如果您必须保证您的应用程序可以在需要时获得 PASV/EPSV 连接,那么您将需要 BalusC 的好答案(除了他的“不支持进入被动模式”是至少从 JDK6 开始有点太强大了,拥有 400K+ 代表的人不应该如此无忧无虑;-P)。
    • @DavidBullock 如果您可以保证您永远不会在官方 Oracle JVM(即 IBM Java 或 Google 应用引擎)以外的任何东西上运行并且您愿意更新如果 Oracle 选择在新的 Java 版本中重构他们的代码库所有其他原因 Oracle 说这是一件非常愚蠢的事情,那么使用非官方的未记录的内部类就可以了。作为紧急情况下的快速且非常肮脏的黑客攻击,它也可以(但在管道中安排了适当的修复)。 “不支持”自然是它的“没有官方API”。做对了
    • @Thor 'Right' 与您正在编写的程序的目标相关。想想URLConnection.openConnection() 的设计目标——它在那里获取一个 URL 并给你一个InputStream。如果任何声称支持 ftp:// URL 的实现在获取流时没有处理 PASV,那么它可能会公正地考虑被破坏。是的,您在编写 FTP 客户端时不会依赖它。但是,如果您正在编写一个应用程序来解析用户碰巧扔给它的任何 URL 的内容,这可能就足够了,并且尽最大努力。知道 Sun 确实 想到了这一点很有用。
    【解决方案2】:

    今天,我们捕获 TCP/IP 数据包并确认 Android/JAVA/URLConnection 仍然使用 PORT(Active 模式) 进行 FTP。

    如果服务器不支持主动模式或网络不支持主动模式,URLConnection 将失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-14
      • 2010-10-15
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多