java.net.SocketException:无效的参数:connect

我的新笔记本电脑(Alienware m17x)抛出一个java.net.SocketException: Invalid argument: connect当我运行以下基本代码时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。 以下是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.(Unknown Source) at java.net.Socket.(Unknown Source) at Client.main(Client.java:5) 

我尝试了一些事情,但没有运气,总是抛出exception。 这是我得出的结论:

  • 更改端口号不会改变任何内容。
  • 这对网络来说不是问题。 我在学校和家里都有例外。
  • 我重新安装了JVM和JDK,但没有运气。
  • 这只发生在一台机器上。 我在桌面上运行了相同的代码,但没有任何exception。 我在两者上都使用Windows 7。
  • 它不会被防火墙阻止。 我已关闭防火墙,但仍然遇到此问题。

我该怎么办或检查以解决此问题?

编辑:路线打印输出:

 =========================================================================== 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 

编辑:正如@PhilippeLM和@ beny23让我意识到,将java系统变量java.net.preferIPv4Stack设置为true可以解决我的问题。 但是,我希望永久修复。 每次运行java应用程序时,我都不想指定系统变量。

这是我再次尝试没有运气的尝试:

  • 按照以下步骤将我的机器首选项设置为首选IPv4
  • 将行java.net.preferIPv4Stack=true添加到%JAVA_HOME%\jre\libnet.properties文件中。

还有什么我可以尝试的吗?

我有一个Alienware m17x R3,我发现我和Java有完全相同的错误,尽管我在Minecraft中遇到过它。 安装较旧的Java6u33解决了这个问题,但我发现即使在等待几个月之后,Java7的更新更新仍然无法正常工作。 所以我最终去了戴尔网站并为我的Alienware笔记本电脑下载了最新的网络驱动程序(因为Alienware现在由戴尔拥有)并立即解决了这个问题。

如果告诉Java使用IPv4堆栈,它是否有效?

启动服务器和客户端时,请使用以下命令行选项。

 -Djava.net.preferIPv4Stack=true 

另见这里

您的计算机似乎具有IPv6配置,并且在Java中默认是首选,因此请尝试使用-Djava.net.preferIPv4Stack = true作为JVM args启动服务器和客户端:

  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指向’Project Execution Environment’JavaSE1.7’,这不是我所期待的。

我将其更改为选项Alternate JRE并将JAVA 8设置为已安装的jre。 这解决了我的问题。

有一个Windows错误不仅影响Java应用程序,而且在JRE位于网络共享的某些星座中产生了这个错误: https : //bugs.openjdk.java.net/browse/JDK-8068568

解决方案是在本地驱动器上使用JRE安装,或者在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 with内容“1”,我没有机会尝试。 我想我还记得在微软支持论坛上阅读一篇post,该论坛表示这不会发生在名称超过8个字符的网络共享上,但我找不到post了。

您可以运行连接到网络或本地主机的其他应用程序吗? 我前一段时间遇到过类似的问题(仅限Win7),我只修改了Network connection-> Repain 。 问题来自于我的路由表已损坏, localhost路由从其中消失,并且尝试连接到localhost任何应用程序都崩溃了,并且出现了与您相同的错误。

你能在命令行中运行route -print并发布输出吗?

编辑:听起来你的IP堆栈已损坏,你可以尝试从MS 修复此问题

请检查您是否在网络位置安装了JDK。 如果是,请更改本地驱动器磁盘中的jdk位置,并确认没有关于权限的限制