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日): 终于成功了!微软公开发布了一个热补丁。他们暗示这个修复将在将来的一次常规软件更新中包含:“如果您没有受到这个问题的严重影响,我们建议您等待包含此热补丁的下一个软件更新。”