web-dev-qa-db-fra.com

java.net.SocketException: argument incorrect: connect

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:

  • Changer les numéros de port ne change rien.
  • Ce n'est pas un problème avec le réseau. J'ai eu l'exception à l'école et à la maison.
  • J'ai réinstallé la JVM et le JDK mais pas de chance.
  • Cela ne se produit que sur une seule machine. J'ai exécuté le même code sur mon bureau et je n'ai aucune exception. J'utilise Windows 7 sur les deux.
  • Il n'est pas bloqué par un pare-feu. J'ai désactivé mes pare-feu et j'ai toujours ce problème.

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:

  • Définir les préférences de mon ordinateur pour préférer IPv4 en suivant ces étapes
  • Ajout de la ligne Java.net.preferIPv4Stack=true au fichier net.properties dans %Java_HOME%\jre\lib.

Y a-t-il autre chose que je puisse essayer?

14
abourg28

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.

5
David

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

6
beny23

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.

4
PhilippeLM

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.

1
Techflash

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.

1
Bernhard Stadler

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

1
Matt Habel

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

0
GETah

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.

0
Bruno Dong