如果防火墙打开,Java 7 会阻止 Windows Vista 和 7 上的 FTP 传输。有任何想法吗?
Posted
技术标签:
【中文标题】如果防火墙打开,Java 7 会阻止 Windows Vista 和 7 上的 FTP 传输。有任何想法吗?【英文标题】:Java 7 prevents FTP transfers on Windows Vista and 7 if firewall is on. Any ideas? 【发布时间】:2011-10-22 20:53:09 【问题描述】:Java 7 阻止在 Windows Vista 和 7 上进行 FTP 传输。
在 FTP 中,在传输文件之前,必须发送 PORT 或 PASV 命令。一旦发送其中一个命令,Windows 防火墙就会关闭发送它的套接字。这只发生在防火墙打开并且没有 java.exe 异常的情况下。我怀疑这个问题与使用新 Vista IP 堆栈的 Java 7 有关。
有没有人知道如何解决或解决这个问题?我们正在分发一个 Java FTP 库,所以我们显然不能自己添加异常。
例外:
java.net.SocketException: Permission denied: recv failed
JRE 版本信息:
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)
后续行动 1(2011 年 11 月 14 日): Oracle 分析了这个问题,发现它似乎是 Windows 防火墙和/或 IPv6 堆栈中的一个错误。他们设法用原生 C(即非 Java)应用程序复制了该问题,因此这是该错误不在 Java 中的有力证据。他们已经通知了微软,所以现在球在他们的球场上。更多详情请关注http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696
后续行动 2(2012 年 7 月 27 日): Oracle 的一位(非常有帮助的)联系人告诉我,该问题现在已在 Microsoft 升级。我们希望很快能看到一些结果。
后续行动 3(2012 年 8 月 15 日): 我们在 Oracle 的联系人告诉我们,Microsoft 已接受该错误并正在对其进行优先处理。
后续行动 4(2012 年 9 月 21 日): Microsoft 已经制作了一个补丁,目前正在由 Oracle 测试。没有发布日期的消息。
后续行动 5(2012 年 10 月 11 日): 终于成功了!微软已经公开发布了hotfix。他们暗示该修复程序将包含在未来的一般软件更新中:
“如果您没有受到此问题的严重影响,我们建议您等待包含此修补程序的下一个软件更新。”
【问题讨论】:
确实很烦人,它也会影响 Ant FTP 任务:java.net.SocketException: Permission denied: recv failed at org.apache.tools.ant.taskdefs.optional.net.FTP$FTPDirectoryScanner。 forceRemoteSensitivityCheck(FTP.java:695) 解决方法:***.com/questions/10473518/… ***.com/questions/17761759/… 【参考方案1】:我已经向 Oracle 提交了错误报告,请参阅 bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696
他们将优先级标记为低,这让我认为他们不太了解问题的严重性,即 FTP 在 Java/Windows 上被破坏。我忘了在错误报告中明确说明这一点。如果其他人认为它应该具有更高的优先级,请在 Oracle 错误报告中添加评论。
我刚刚注意到你也可以为这个错误“投票”,所以如果你同意它很重要,请给它投票。
【讨论】:
解决方法:***.com/questions/10473518/…【参考方案2】:这里有一个测试用例报告了同样的错误: Java 7 Socket Exception Bug论坛。 这是 Java 7 的问题
【讨论】:
【参考方案3】:在此处发布有关此问题的博客: http://podzemski.com/2011/09/12/java-7-prevents-ftp-transfers-on-windows-when-firewall-is-on/
也许它会引起对问题的一些额外认识。
【讨论】:
谢谢。顺便说一句,主动传输(即 PORT 命令)也会受到影响。 感谢 HansA 的提醒,我会更改博文。【参考方案4】:问题是由防火墙的状态 FTP 过滤器引起的。作为一种解决方法,您可以通过使用管理员权限执行 netsh advfirewall set global StatefulFTP disable
来禁用它。
【讨论】:
我在想我的代码有问题。愚蠢的 Win7 防火墙 + Java 交互。 +1。 确认这解决了 Java 1.7.0_09 和 Windows Vista Home Premium(带有 SP2)的问题。 为我工作,而且比 MS 的那个地狱般的修补程序快得多 netsh advfirewall set global StatefulFTP disable 对我有用 :)【参考方案5】:这个问题可以在没有 JDK7 的情况下演示,它是 Windows 7 中的防火墙在应用程序使用 IPv6 映射的 IPv4 地址时阻止了 ftp 协议。有关更多详细信息和解决方法,请参阅http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696。
【讨论】:
【参考方案6】:另一种解决方法是使用以下命令启动 JVM:
-Djava.net.preferIPv4Stack=true
【讨论】:
我在一个小程序中遇到了这个问题,所以我正在使用:System.setProperty("java.net.preferIPv4Stack", "true");
除了 Firefox (16.0.2) 之外的所有浏览器都可以工作。【参考方案7】:
我们测试了 Windows 修补程序 http://support.microsoft.com/kb/2754804 并确认它确实解决了问题。
【讨论】:
此修补程序是否也解决了 Windows Vista 的问题?它未在先决条件中列出。 我们没有在 Vista 上测试过这个【参考方案8】:其实windows 7上JDK7下的TFTP也有同样的问题,MS hotfix确实解决了FTP问题,但还是不能对TFTP起作用。似乎 Oracle 应该向 MS 报告同样的问题并获得另一个修补程序来解决 TFTP 问题。
【讨论】:
【参考方案9】:我在使用 IDE Eclipse Neon、JAVA 7 和 Windows 7 Professional 时遇到了同样的问题。尝试将 PDF 文件上传到 FTP 服务器。我通过以管理员身份在 CMD 中运行以下命令解决了这个问题:
C: \ Users \ pc01> netsh advfirewall set global StatefulFTP disable
【讨论】:
堆栈溢出requires that all posts be in English。我编辑了您的帖子以遵守此规则。有特定语言的 Stack Overflow 社区允许使用非英语:Spanish、Japanese、Russian、Portuguese。以上是关于如果防火墙打开,Java 7 会阻止 Windows Vista 和 7 上的 FTP 传输。有任何想法吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何添加规则以阻止 chrome 或 firefox 等程序使用 Window 防火墙或 netsh advfirewall-C# 访问任何 IP 地址?