14

java.net.SocketException: Invalid argument: connect当我运行以下基本代码时,我的新笔记本电脑 (Alienware m17x) 会抛出错误:

服务器.java:

public static void main (String[] args) throws Exception {
        
    ServerSocket serverSocket = new ServerSocket (8888);
    Socket socket = serverSocket.accept();
}

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

我已经尝试了一些事情,但没有运气总是抛出异常。以下是我的结论:

  • 更改端口号不会改变任何内容。
  • 这不是网络的问题。我在学校和家里都遇到了例外。
  • 我已经重新安装了 JVM 和 JDK,但没有运气。
  • 这只发生在一台机器上。我在我的桌面上运行了相同的代码,我没有遇到任何异常。我在两者上都使用 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到.net.properties%JAVA_HOME%\jre\lib

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

4

8 回答 8

6

如果您告诉 Java 使用 IPv4 堆栈,它会起作用吗?

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

-Djava.net.preferIPv4Stack=true

另请参阅此处

于 2011-11-28T20:36:16.550 回答
5

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

于 2012-09-24T02:59:17.913 回答
4

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

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

还要确保当 Windows 的防火墙请求您许可时,您没有拒绝应用程序网络访问。如果您这样做了,您可以在控制面板中更改设置。

于 2011-12-01T19:52:25.397 回答
3

有一个 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内容“1”,我没有机会尝试。我想我还记得在 Microsoft 支持论坛上读过一篇帖子,该帖子称这不会发生在名称超过 8 个字符的网络共享上,但我再也找不到该帖子了。

于 2018-03-08T09:46:21.500 回答
1

我已经找到了一种方法,可以从这里永久更改。

您需要做的是添加一个名为 JAVA_TOOL_OPTIONS 的系统变量,并将其设置为您希望在启动时作为命令行参数传递给 java 的任何内容,在您和我的情况下

-Djava.net.preferIPv4Stack=true

于 2012-03-29T01:05:58.990 回答
1

还要检查您的 IDE 是否使用了您期望的 JRE。
我有同样的问题:

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

当我检查我的运行配置时,我的默认 JRE 指向'项目执行环境'JavaSE1.7',这不是我所期望的。

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

于 2017-12-07T12:57:56.807 回答
0

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

您可以route -print在命令行中运行并发布输出吗?

编辑: 听起来您的 IP 堆栈已损坏,您可以尝试从 MS进行此修复

于 2011-11-21T18:48:59.250 回答
0

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

于 2018-08-24T02:44:25.657 回答