Mon nouvel ordinateur portable (Alienware m17x) émet un Java.net.SocketException: Invalid argument: connect
lorsque je lance le code de base suivant:
Server.Java:
public static void main (String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket (8888);
Socket socket = serverSocket.accept();
}
Client.Java:
public static void main (String[] args) throws Exception {
Socket socket = new Socket ("localhost", 8888);
}
Chaque fois que j'exécute Client.Java (après avoir démarré Server.Java), je reçois cette exception de socket. Voici la trace complète de l'exception:
Exception in thread "main" Java.net.SocketException: Invalid argument: connect
at Java.net.DualStackPlainSocketImpl.connect0(Native Method)
at Java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at Java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at Java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at Java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at Java.net.PlainSocketImpl.connect(Unknown Source)
at Java.net.SocksSocketImpl.connect(Unknown Source)
at Java.net.Socket.connect(Unknown Source)
at Java.net.Socket.connect(Unknown Source)
at Java.net.Socket.<init>(Unknown Source)
at Java.net.Socket.<init>(Unknown Source)
at Client.main(Client.Java:5)
J'ai essayé plusieurs choses, mais pas de chance, l'exception est toujours levée. Voici ce que j'ai conclu:
Que dois-je faire ou vérifier pour résoudre ce problème?
EDIT: Achemine les sorties d'impression:
===========================================================================
Interface List
15...e4 d5 3d 08 cb 83 ......Killer Wireless-N 1103 Network Adapter
13...d0 df 9a b5 73 dc ......Bluetooth Device (Personal Area Network)
11...d4 be d9 00 10 65 ......Atheros AR8151 PCI-E Gigabit Ethernet Controller (NDIS 6.20)
1...........................Software Loopback Interface 1
17...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
16...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #2
18...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
19...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #3
===========================================================================
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.0.1 192.168.0.191 25
127.0.0.0 255.0.0.0 On-link 127.0.0.1 306
127.0.0.1 255.255.255.255 On-link 127.0.0.1 306
127.255.255.255 255.255.255.255 On-link 127.0.0.1 306
192.168.0.0 255.255.255.0 On-link 192.168.0.191 281
192.168.0.191 255.255.255.255 On-link 192.168.0.191 281
192.168.0.255 255.255.255.255 On-link 192.168.0.191 281
224.0.0.0 240.0.0.0 On-link 127.0.0.1 306
224.0.0.0 240.0.0.0 On-link 192.168.0.191 281
255.255.255.255 255.255.255.255 On-link 127.0.0.1 306
255.255.255.255 255.255.255.255 On-link 192.168.0.191 281
===========================================================================
Persistent Routes:
None
IPv6 Route Table
===========================================================================
Active Routes:
If Metric Network Destination Gateway
17 58 ::/0 On-link
1 306 ::1/128 On-link
17 58 2001::/32 On-link
17 306 2001:0:4137:9e76:28f3:2721:524f:e2ef/128
On-link
15 281 fe80::/64 On-link
17 306 fe80::/64 On-link
17 306 fe80::28f3:2721:524f:e2ef/128
On-link
15 281 fe80::68c1:bc79:fefa:88a2/128
On-link
1 306 ff00::/8 On-link
17 306 ff00::/8 On-link
15 281 ff00::/8 On-link
===========================================================================
Persistent Routes:
None
EDIT: Comme @PhilippeLM et @ beny23 m'ont fait comprendre, définir la variable système Java Java.net.preferIPv4Stack sur true résout mon problème. Cependant, je veux une solution permanente. Je ne veux pas spécifier la variable système chaque fois que j'exécute une application Java.
Voici ce que j'ai essayé sans succès encore une fois:
Java.net.preferIPv4Stack=true
au fichier net.properties
dans %Java_HOME%\jre\lib
.Y a-t-il autre chose que je puisse essayer?
J'ai un Alienware m17x R3 et j'ai constaté que j'avais exactement la même erreur avec Java, même si je l'ai rencontré avec Minecraft. L'installation de Java6u33 plus ancien a résolu le problème, mais j'ai constaté que les nouvelles mises à jour de Java7 ne fonctionnaient toujours pas, même après plusieurs mois d'attente. Je me suis donc rendu sur le site Web de Dell et j'ai téléchargé les derniers pilotes réseau pour mon ordinateur portable Alienware (car Alienware appartient maintenant à Dell), ce qui a immédiatement résolu le problème.
Cela fonctionne-t-il si vous dites à Java d'utiliser la pile IPv4?
Utilisez l'option de ligne de commande suivante lors du démarrage du serveur et du client.
-Djava.net.preferIPv4Stack=true
Voir aussi ici
Votre machine semble avoir une configuration IPv6 et est préféré par défaut en Java alors essayez de démarrer votre serveur et votre client avec -Djava.net.preferIPv4Stack = true comme JVM args
Java -Djava.net.preferIPv4Stack=true Client.main
Assurez-vous également que vous n'avez pas refusé l'accès au réseau de l'application lorsque le pare-feu de Windows vous a demandé l'autorisation. Si vous le faites, vous pouvez modifier les paramètres dans le panneau de configuration.
Vérifiez également si votre IDE utilise le JRE auquel vous vous attendez.
J'ai eu le même problème:
Java.sql.SQLException: JZ006: Caught IOException: Java.net.SocketException: Invalid argument: create
Lorsque j'ai vérifié ma configuration d'exécution, mon JRE par défaut pointait vers «JavaSE1.7» de «Project Execution Environment», ce que je n'attendais pas.
Je l'ai changée pour l'option Alterner JRE et configurer Java 8 comme jre installé , Ce qui a résolu mon problème.
Il existe un bogue Windows qui affecte non seulement les applications Java et génère exactement cette erreur dans certaines constellations où le JRE est situé sur un partage réseau: https://bugs.openjdk.Java.net/browse/JDK-8068568
La solution consiste à utiliser une installation JRE sur un lecteur local ou à accorder l’autorisation Lister les dossiers sur tous les dossiers ancêtres de l’exécutable JRE.
Dans https://social.msdn.Microsoft.com/Forums/windowsdesktop/en-US/3076a9cd-57a0-418d-8de1-07adc3b486bb il est suggéré d'ajouter une valeur DWORD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\service\FltMgr\UseTildeShortcut avec le contenu "1", que je n'ai pas eu l'occasion d'essayer. Je pense me souvenir aussi d'avoir lu un message sur un forum de support technique Microsoft qui indiquait que cela ne se produit pas sur les partages réseau dont le nom compte plus de 8 caractères, mais je ne trouve plus le message.
J'ai trouvé un moyen d'en faire un changement permanent de ici .
Ce que vous devez faire est d’ajouter une variable système nommée Java_TOOL_OPTIONS et définissez-la sur tout ce que vous voulez transmettre à Java en tant qu’argument de ligne de commande à chaque démarrage, dans le vôtre et dans mon cas.
-Djava.net.preferIPv4Stack=true
Pouvez-vous exécuter d'autres applications qui se connectent au réseau ou à l'hôte local? J'ai eu un problème similaire il y a quelque temps (uniquement sous Win7) et je l'ai corrigé en allant uniquement à Network connection-> Repain
. Le problème venait du fait que ma table de routage était corrompue, que la route localhost
en avait disparu et que toute application tentant de se connecter à localhost
plantait avec la même erreur que la vôtre.
Pouvez-vous exécuter route -print
dans une ligne de commande et publier le résultat?
EDIT: On dirait que votre pile IP est corrompue, vous pouvez essayer ce correctif depuis MS
Veuillez vérifier si vous avez installé JDK à l’emplacement réseau. Si oui, veuillez changer l'emplacement de jdk sur le disque dur local et confirmer qu'il n'y a pas de limite concernant les permissions.