Java 7 empêche les transferts FTP sur Windows Vista et 7.
En FTP, avant qu'un fichier ne soit transféré, une commande PORT ou PASV doit être envoyée. Dès que l'une des commandes est envoyée, le Pare-feu Windows ferme le socket qui l'a envoyé. Cela se produit uniquement si le pare-feu est activé et qu’une exception pour Java.exe est absente. Je soupçonne que ce problème est lié à Java 7 utilisant la nouvelle pile IP Vista.
Quelqu'un a-t-il des idées sur la façon de résoudre ou de contourner ce problème? Nous distribuons une bibliothèque Java FTP, nous ne pouvons donc évidemment pas ajouter d'exceptions nous-mêmes.
Exception:
Java.net.SocketException: Permission denied: recv failed
Informations sur la version de 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)
SUIVI 1 (14 novembre 2011): Oracle a analysé le problème et a constaté qu'il semblait s'agir d'un bogue du Pare-feu Windows et/ou de la pile IPv6. Ils ont réussi à reproduire le problème avec une application C (c'est-à-dire non-Java) native. Il est donc évident que le bogue n'est pas en Java. Ils ont informé Microsoft, la balle est donc dans leur camp maintenant. Plus de détails peuvent être trouvés à http://bugs.Sun.com/bugdatabase/view_bug.do?bug_id=7077696
FOLLOW-UP 2 (27 juillet 2012): Un contact (très utile) chez Oracle m'a dit que le problème avait été escaladé chez Microsoft. Nous espérons voir des résultats bientôt.
SUIVI 3 (15 août 2012): Notre contact chez Oracle nous a dit que Microsoft avait accepté le bogue et était en train de le hiérarchiser.
SUIVI 4 (21 septembre 2012): Microsoft a produit un correctif qui est actuellement testé par Oracle. Pas de mot sur une date de sortie.
SUIVI 5 (11 octobre 2012): Le succès enfin! Microsoft a publié publiquement un correctif . Ils impliquent que le correctif sera inclus dans une mise à jour logicielle générale à l'avenir:
"Si vous n'êtes pas gravement touché par ce problème, nous vous recommandons d'attendre la prochaine mise à jour logicielle contenant ce correctif."
Nous avons testé le correctif Windows http://support.Microsoft.com/kb/2754804 et avons confirmé qu'il résolvait le problème.
Le problème est dû au filtre FTP avec état du pare-feu. Pour contourner le problème, vous pouvez le désactiver en exécutant netsh advfirewall set global StatefulFTP disable
avec des droits d'administrateur.
Une autre solution consiste à démarrer la machine virtuelle Java avec:
-Djava.net.preferIPv4Stack=true
J'ai soumis un rapport de bogue à Oracle, voir bugs.Sun.com/bugdatabase/view_bug.do?bug_id=7077696
Ils ont marqué la priorité comme faible, ce qui me fait penser qu’ils ne comprennent pas tout à fait l’ampleur du problème, c’est-à-dire que le FTP est cassé sous Java/Windows. J'ai oublié de l'indiquer explicitement dans le rapport de bogue. Si quelqu'un d'autre pense qu'il devrait avoir une priorité plus élevée, veuillez ajouter un commentaire au rapport de bogue Oracle.
Je viens de remarquer que vous pouvez aussi "voter" pour le bogue, alors votez-le s'il vous plaît si vous êtes d'accord pour dire qu'il est important.
Ce problème peut être démontré sans JDK7, c'est le pare-feu de Windows 7 qui bloque le protocole ftp lorsque l'application utilise des adresses IPv4 mappées IPv6. Voir http://bugs.Sun.com/bugdatabase/view_bug.do?bug_id=7077696 pour plus de détails et des solutions de contournement.
En fait, TFTP sous JDK7 sous Windows 7 a également le même problème, le correctif MS résout le problème FTP, mais ne fonctionne toujours pas pour TFTP. Semble que Oracle devrait signaler le même problème à MS et obtenir un autre correctif pour résoudre le problème TFTP également.
Blogué sur le problème ici: http://podzemski.com/2011/09/12/Java-7-prevents-ftp-transfers-on-windows-when-firewall-is-on/
Peut-être que cela provoquera une prise de conscience supplémentaire du problème.
Le même bogue a été signalé ici avec un scénario de test: Java 7 Socket Exception Bug forum .
J'ai eu le même problème avec IDE Eclipse Neon, Java 7 et Windows 7 Professional. Essayer de télécharger un fichier PDF sur un serveur FTP. Je l'ai résolu en exécutant la commande suivante dans CMD en tant qu'administrateur:
C: \ Users \ pc01> netsh advfirewall set global StatefulFTP disable