Java 7在Windows Vista和7上如果防火墙打开会阻止FTP传输。有什么想法吗?

74

Java 7 在 Windows Vista 和 7 上阻止了 FTP 传输。

在 FTP 中,在文件传输之前必须发送 PORT 或 PASV 命令。一旦发送其中一个命令,Windows 防火墙就会关闭发送该命令的套接字。只有在防火墙开启且没有为 java.exe 添加异常时才会发生这种情况。我怀疑这个问题与 Java 7 使用的新 Vista IP 栈有关。

有人有什么办法来解决或绕过这个问题吗?我们正在分发一个 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中。他们已经通知了微软,现在球在他们那边了。更多详细信息可以在https://bugs.java.com/bugdatabase/view_bug?bug_id=7077696找到。

后续2(2012年7月27日): Oracle的一个(非常有帮助的)联系人告诉我,这个问题现在已经被提升到了微软那边。我们希望很快能看到一些结果。

后续3(2012年8月15日): 我们在Oracle的联系人告诉我们,微软已经接受了这个错误,并正在对其进行优先处理。

后续4(2012年9月21日): 微软已经制作了一个补丁,目前正在由Oracle进行测试。关于发布日期还没有消息。

跟进5(2012年10月11日): 终于成功了!微软公开发布了一个热补丁。他们暗示这个修复将在将来的一次常规软件更新中包含:
“如果您没有受到这个问题的严重影响,我们建议您等待包含此热补丁的下一个软件更新。”

3
确实非常恼人,它还影响了Ant FTP任务:java.net.SocketException: Permission denied: recv failed。在org.apache.tools.ant.taskdefs.optional.net.FTP$FTPDirectoryScanner.forceRemoteSensitivityCheck(FTP.java:695)处。 - user502187
解决方法:https://dev59.com/vGPVa4cB1Zd3GeqP6YbM#10473581 - Entree
http://stackoverflow.com/questions/17761759/socket-connection-works-only-when-firewall-is-off - Nitesh Verma
9个回答

88

问题是由防火墙的有状态FTP过滤器引起的。 作为解决方法,您可以使用管理员权限执行netsh advfirewall set global StatefulFTP disable来禁用它。


2
我还以为我的代码有问题呢,原来是Win7防火墙和Java的交互出了问题。+1。 - aroth
确认这解决了Java 1.7.0_09和Windows Vista Home Premium(带SP2)的问题。 - Warren Sergent
对我来说很有效,比微软那个可怕的热修复快得多。 - Gruber
netsh advfirewall set global StatefulFTP disable 对我起了作用 :) - Yuseferi

15

另一个解决方法是使用以下命令启动JVM:

-Djava.net.preferIPv4Stack=true

3
我在一个小应用程序中遇到了这个问题,于是我使用了:System.setProperty("java.net.preferIPv4Stack", "true"); 这样就能在除了Firefox(16.0.2)之外的所有浏览器上工作了。 - bobndrew

14
我已向Oracle提交了一个错误报告,请查看bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696
他们将优先级标记为低,这让我觉得他们并没有完全理解问题的严重性,即Java/Windows上的FTP功能存在问题。我忘记在错误报告中明确指出这一点。如果有其他人认为它应该有更高的优先级,请在Oracle的错误报告中添加评论。
我刚刚注意到,您还可以为该错误投票,如果您认为它很重要,请给它投票。

解决方法:https://dev59.com/vGPVa4cB1Zd3GeqP6YbM#10473581 - Entree

14

这个热补丁是否也解决了Windows Vista的问题?它没有列在先决条件中。 - ThomasPeeters
我们没有在Vista上进行测试。 - lyaffe

5

2

实际上,在Windows 7的JDK7下,TFTP也存在相同的问题。MS热修复程序可以解决FTP问题,但对TFTP无效。看来Oracle应该向微软报告同样的问题,并获得另一个热修复程序来解决TFTP问题。


2

顺便说一下,主动传输(即PORT命令)也会受到影响。谢谢。 - HansA
谢谢你提醒我,HansA。我会修改博客文章的。 - Tommie

1

0

我在使用Eclipse Neon、JAVA 7和Windows 7 Professional时遇到了同样的问题。尝试将PDF文件上传到FTP服务器。我通过以管理员身份在CMD中运行以下命令来解决它:

C: \ Users \ pc01> netsh advfirewall set global StatefulFTP disable

1
Stack Overflow 要求所有帖子必须使用英语。我编辑了您的帖子以符合此规则。有一些特定语言的 Stack Overflow 社区允许非英语提问:西班牙语日语俄语葡萄牙语 - FelixSFD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接