Ответ 1
Мы протестировали исправление Windows http://support.microsoft.com/kb/2754804 и подтвердили, что оно разрешило проблему.
Java 7 предотвращает передачу FTP в Windows Vista и 7.
В FTP, перед передачей файла должна быть отправлена команда PORT или PASV. Как только одна из команд отправляется, брандмауэр Windows закрывает сокет, который его отправил. Это происходит только в том случае, если брандмауэр включен, а исключение для java.exe отсутствует. Я подозреваю, что эта проблема связана с Java 7 с использованием нового IP-стека Vista.
Есть ли у кого-нибудь идеи, как исправить или обойти эту проблему? Мы распространяем библиотеку 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 (14 ноября 2011 г.): Oracle проанализировала проблему и обнаружила, что она кажется ошибкой в брандмауэре Windows и/или стеке IPv6. Им удалось реплицировать проблему с помощью родного приложения C (например, не Java), поэтому это убедительное доказательство того, что ошибка не в Java. Они сообщили Microsoft, так что мяч сейчас в их дворе. Более подробную информацию можно найти на http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696
ПОСЛЕДУЮЩАЯ ДЕЯТЕЛЬНОСТЬ 2 (27 июля 2012 г.): A (очень полезный) контакт в Oracle сказал мне, что проблема теперь переросла в Microsoft. Мы надеемся вскоре увидеть некоторые результаты.
ПОСЛЕДУЮЩАЯ ДЕЯТЕЛЬНОСТЬ 3 (15 августа 2012 г.): Наш контакт в Oracle сказал нам, что Microsoft приняла ошибку и находится в процессе определения приоритетов.
ПОСЛЕДУЮЩАЯ ДЕЯТЕЛЬНОСТЬ 4 (21 сентября 2012 г.): Microsoft выпустила патч, который в настоящее время тестируется Oracle. Нет слова о дате выпуска.
ПОСЛЕДУЮЩАЯ ДЕЯТЕЛЬНОСТЬ 5 (11 октября 2012 г.): Успех наконец! Microsoft публично выпустила исправление. Они подразумевают, что исправление будет включено в общее обновление программного обеспечения в будущем:
", если вы не сильно пострадали от этой проблемы, мы рекомендуем дождаться следующего обновления программного обеспечения, содержащего это исправление."
Мы протестировали исправление Windows http://support.microsoft.com/kb/2754804 и подтвердили, что оно разрешило проблему.
Проблема вызвана фильтром FTP брандмауэра с состоянием. В качестве обходного пути вы можете отключить его, выполнив netsh advfirewall set global StatefulFTP disable
с правами администратора.
Я отправил отчет об ошибке в Oracle, см. bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696
Они отметили приоритет как низкий, что заставляет меня думать, что они не совсем понимают масштабы проблемы, т.е. что FTP нарушен на Java/Windows. Я забыл указать это явно в отчете об ошибке. Если кому-то еще кажется, что он должен иметь более высокий приоритет, добавьте комментарий к отчету об ошибке Oracle.
Я только заметил, что вы также можете "проголосовать" за ошибку, поэтому, пожалуйста, проголосуйте, если вы согласитесь на это.
Другим обходным путем является запуск JVM с помощью
-Djava.net.preferIPv4Stack=true
Эта проблема может быть продемонстрирована без JDK7, это брандмауэр в Windows 7, блокирующий протокол ftp, когда приложение использует IPv4-адреса IPv6. См. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696 для получения более подробной информации и обходных решений.
Блог о проблеме здесь: http://podzemski.com/2011/09/12/java-7-prevents-ftp-transfers-on-windows-when-firewall-is-on/
Возможно, это вызовет дополнительную осведомленность о проблеме.
На самом деле TFTP под JDK7 на Windows 7 также имеет ту же проблему, исправление MS разрешает проблему с FTP, но все еще не работает для TFTP. Кажется, Oracle должна сообщить о той же проблеме в MS и получить еще одно исправление для решения проблемы TFTP.
О той же ошибке сообщалось здесь с тестовым примером: форум Java 7 Socket Exception Bug. Его проблема с Java 7
У меня была такая же проблема с использованием IDE Eclipse Neon, JAVA 7 и Windows 7 Professional. Попытка загрузить файл PDF на FTP-сервер. Я решил это, выполнив следующую команду в CMD как администратор:
C: \ Users \ pc01> netsh advfirewall set global StatefulFTP disable