java.net.SocketException: Недопустимый аргумент: connect

Мой новый ноутбук (Alienware m17x) бросает java.net.SocketException: Invalid argument: connect при запуске следующего базового кода:

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); } 

Каждый раз, когда я запускаю Client.java (после запуска Server.java), я получаю это исключение сокета. Вот полный след исключения:

 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.(Unknown Source) at java.net.Socket.(Unknown Source) at Client.main(Client.java:5) 

Я пробовал несколько вещей, но не удача всегда исключает исключение. Вот что я сделал:

  • Изменение номеров портов ничего не меняет.
  • Это не проблема с сетью. Я получил исключение в школе и дома.
  • Я переустановил JVM и JDK, но не повезло.
  • Это происходит только на одной машине. Я запустил тот же код на своем рабочем столе, и у меня не было никаких исключений. Я использую Windows 7 на обоих.
  • Он не блокируется брандмауэром. Я отключил свои брандмауэры, и у меня все еще есть эта проблема.

Что я должен сделать или проверить, чтобы решить эту проблему?

EDIT: выходные данные маршрута:

 =========================================================================== 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: Как @PhilippeLM и @ beny23 заставили меня понять, установив java-системную переменную java.net.preferIPv4Stack в true, решает мою проблему. Однако я хочу постоянное исправление. Я не хочу указывать системную переменную каждый раз, когда запускаю java-приложение.

Вот что я пробовал, не повезло еще раз:

  • Настройка параметров моей машины для предпочтения IPv4, выполнив следующие шаги
  • Добавление строки java.net.preferIPv4Stack=true в файл net.properties в %JAVA_HOME%\jre\lib .

Есть ли что-нибудь еще, что я могу попробовать?

У меня есть Alienware m17x R3, и я обнаружил, что у меня была такая же ошибка с Java, хотя я столкнулся с Minecraft. Установка устаревшего Java6u33 устранила проблему, но я обнаружил, что более новые обновления Java7 по-прежнему не работают даже после нескольких месяцев ожидания. Поэтому я в конце концов перешел на веб-сайт Dell и загрузил самые последние сетевые драйверы для моего ноутбука Alienware (поскольку Alienware теперь принадлежит Dell), и это сразу устранило проблему.

Работает ли он, если вы скажете Java использовать стек IPv4?

При запуске сервера и клиента используйте следующий параметр командной строки.

 -Djava.net.preferIPv4Stack=true 

См. Также здесь

Кажется, что у вашей машины есть конфигурация IPv6, и по умолчанию она предпочтительнее в Java, поэтому попробуйте запустить свой сервер и клиент с -Djava.net.preferIPv4Stack = true в качестве аргументов JVM:

  java -Djava.net.preferIPv4Stack=true Client.main 

Также убедитесь, что вы не отказали в доступе к сети приложений, когда брандмауэр Windows попросил вас получить разрешение. Если вы это сделали, вы можете изменить настройки на панели управления.

Я придумал способ сделать это постоянным изменением отсюда .

Что вам нужно сделать, это добавить системную переменную JAVA_TOOL_OPTIONS и установить ее так, чтобы вы передавали java в качестве аргумента командной строки всякий раз, когда она запускается, в вашем и моем случае

-Djava.net.preferIPv4Stack=true

Также проверьте, использует ли ваша IDE JRE, которую вы ожидаете.
У меня была такая же проблема:

 java.sql.SQLException: JZ006: Caught IOException: java.net.SocketException: Invalid argument: create 

Когда я проверил свою конфигурацию запуска, мой JRE по умолчанию указывал на «Environment Execution Environment» JavaSE1.7, которого я не ожидал.

Я изменил его на вариант Alternate JRE и установил JAVA 8 как установленный jre. которая решила мою проблему.

Существует ошибка Windows, которая затрагивает не только Java-приложения, но и производит именно эту ошибку в некоторых созвездиях, где JRE находится в общем сетевом ресурсе: https://bugs.openjdk.java.net/browse/JDK-8068568

Решение либо использует установку JRE на локальном диске, либо предоставляет разрешение на использование списка Folder во всех папках предков JRE exe.

В https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/3076a9cd-57a0-418d-8de1-07adc3b486bb предлагается добавить значение DWORD HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ FltMgr \ UseTildeShortcut с контент «1», который у меня не было возможности попробовать. Я также помню, как читал сообщение на форуме поддержки Microsoft, в котором говорилось, что этого не происходит в сетевых ресурсах, чье имя длиннее 8 символов, но я больше не могу найти сообщение.

Можете ли вы запускать другие приложения, которые подключаются к сети или локальному хосту? У меня была аналогичная проблема некоторое время назад (только на Win7), и я исправил ее, только выбрав Network connection-> Repain . Проблема возникла из-за того, что моя таблица маршрутизации была повреждена, маршрут localhost исчез из нее, и любое приложение, пытающееся подключиться к localhost сбой с той же ошибкой, что и ваша.

Можете ли вы запустить route -print в командной строке и опубликовать вывод?

EDIT: Похоже, что ваш IP-стек поврежден, вы можете попробовать это исправление от MS

Проверьте, установлен ли JDK в сетевом расположении. если да, пожалуйста, измените местоположение jdk на локальном диске и убедитесь, что нет ограничений на разрешение

  • Обнаружение отключения клиента TCP
  • Почему писать закрытый TCP-разъем хуже, чем читать?
  • Как обнаружить разъединение сокета TCP (с гнездом C Berkeley)
  • Отправить HTTP-запрос вручную через сокет
  • NetworkStream.ReadAsync с маркером отмены никогда не отменяет
  • java.io.StreamCorruptedException: недопустимый код типа: 00
  • Как вы дросселируете пропускную способность соединения сокета в C?
  • API сокетов Java. Как узнать, было ли соединение закрыто?
  • Простая Java-клиентская / серверная программа
  • java.net.SocketException: сброс соединения
  • Простой сервер Http с Java / Socket?
  • Давайте будем гением компьютера.