如果启用防火墙,Java 7将阻止Windows Vista和7上的FTP传输.有任何想法吗?

Han*_*nsA 76 windows ftp windows-firewall wfp java-7

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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

后续行动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日): 甲骨文的一位(非常有帮助的)联系人告诉我,这个问题现在已经在微软升级了.我们希望尽快看到一些结果.

后续行动3(2012年8月15日): 我们在Oracle的联系人告诉我们,微软已接受该错误并正在确定其优先级.

后续行动4(2012年9月21日): 微软已经制作了一个目前正在由甲骨文测试的补丁.在发布日期没有任何消息.

后续行动5(2012年10月11日): 终于成功了!微软已公开发布了一个修补程序.他们暗示该修复程序将在未来包含在一般软件更新中:

"如果您没有受到此问题的严重影响,我们建议您等待包含此修补程序的下一个软件更新."

小智 88

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

  • 在这里,我认为我的代码有问题.愚蠢的Win7防火墙+ Java交互.+1. (2认同)
  • 有用.运行此命令有任何副作用吗? (2认同)

Han*_*nsA 15

我已经向Oracle提交了一个错误报告,请参阅bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696

他们将优先级标记为低,这让我觉得他们不太了解问题的严重程度,即FTP在Java/Windows上被破坏了.我忘了在bug报告中明确说明.如果其他人觉得它应该具有更高的优先级,请在Oracle错误报告中添加注释.

我刚刚注意到你也可以对这个错误进行"投票",所以如果你同意这个错误,请给它投票.


pru*_*nge 15

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

-Djava.net.preferIPv4Stack=true
Run Code Online (Sandbox Code Playgroud)

  • 我在applet中遇到了这个问题,所以我正在使用:`System.setProperty("java.net.preferIPv4Stack","true");`除了Firefox(16.0.2)之外的每个浏览器都适用. (3认同)

lya*_*ffe 14

我们测试了Windows修补程序http://support.microsoft.com/kb/2754804并确认它确实解决了该问题.


小智 5

没有JDK7就可以证明这个问题,当应用程序使用IPv6映射的IPv4地址时,Windows 7中的防火墙会阻止ftp协议.有关更多详细信息和解决方法,请参见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696.