2

任何人都可以解释 java.net.ConnectException: Connection timed out

Caused by: java.net.ConnectException: Connection timed out 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:337) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:198) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391) 
    at java.net.Socket.connect(Socket.java:579) 
    at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at net.sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:289) 
    at net.sourceforge.jtds.jdbc.SharedSocket.(SharedSocket.java:250) 
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:297)
4

3 回答 3

1

如果您能够 ping 通 sql server,那么这可能是 sql server 实例中的 TCP/IP 配置有问题。

您可以参考这个关于如何启用 TCP/IP的问题,也可以参考微软的这篇文章和这篇文章。

  1. 启动 SQL Server 配置管理器。单击开始,指向所有程序,然后单击 Microsoft SQL Server。单击配置工具,然后单击 SQL Server 配置管理器。
  2. 在 SQL Server 配置管理器的控制台窗格中,展开 SQL Server 网络配置。
  3. 在控制台窗格中,单击 的协议。
  4. 在详细信息窗格中,右键单击 TCP/IP,然后单击启用。
  5. 在控制台窗格中,单击 SQL Server 服务。
  6. 在详细信息窗格中,右键单击 SQL Server (),然后单击重新启动,以停止并重新启动 SQL Server 服务。
于 2013-01-08T11:59:12.593 回答
1

这意味着驱动程序试图在该端口上打开与该 IP 的连接,但没有人在该端口上侦听,因此没有人回答因此“连接超时”消息。

正如 Arunn P Johny 建议的那样,如果您打开命令行并运行

telnet localhost 4545

它的反应是这样的

Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

这意味着没有人在听。例如,尝试在该端口上打开套接字(数据库连接)将导致连接超时异常。(选择端口 4545 是因为我的电脑上没有任何东西在监听)

如果它回应其他任何东西,例如

telnet localhost 3306

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

这意味着端口是开放的,不会抛出异常。(我的电脑上有 MySQL 监听 3306)。

很可能您的数据库连接字符串中的 IP 和端口(请参阅此处以供参考)是错误的,例如设置为没有数据库正在侦听的某个端口。

请参阅此答案HTTP 错误 408 请求超时的解释(这是相同的错误)。

编辑:

我最初给出了一个错误的答案(正如 EJP 指出的那样)。建立连接时,这两个错误都发生在 TCP 级别:

  • Connection refused表示没有人在给定端口上监听
  • Connection timeout表示无法建立连接,或者如 EJP 所述,连接尝试超时。

假设您在 Java 中有以下行,最终 JDBC 驱动程序会在某些时候执行(类似的操作):

Socket s = new Socket(IP,PORT);

执行此行之前,(TCP)连接已关闭执行此行并且没有抛出异常之后,连接就建立了(如构造函数的 apidoc 中所述)。这条线正在执行时,这就是实际发生的情况(称为TCP 三向握手):

TCP 三次握手

让我们回顾一下两种可能的情况。

首先,假设 IP 是可访问的(例如ping IP,从命令行开始打印响应时间到控制台)但没有进程在 PORT 上侦听。三向握手将按照绘制的方式进行,但是一旦建立连接,服务器将找不到他的任何进程在该端口上侦听,并将立即开始关闭连接 -Connection refused将被抛出。

这是此异常的唯一可能结果

现在,让我们假设 IP 不可访问。客户端将发送连接请求,但永远不会收到已授予的连接。在给定的时间段(超时)过去后,Connection timeout将被抛出。考虑以下代码:

    String reachableIP = "127.0.0.1";
    String unreachableIP = "10.192.0.1";
    int connTimeout = 1000;
    long duration = 0;        
    try {
        duration = System.currentTimeMillis();            
        new Socket().connect(new InetSocketAddress(unreachableIP, 3306), connTimeout);
    }
    catch (Exception e) {
        duration = System.currentTimeMillis() - duration;           
        System.out.println("connect attempt duration measured in ms:" + duration);
        System.out.println(e.getMessage());
    }

输出:

connect attempt duration measured in ms:1009
connect timed out

这在连接方法的 apidoc 中也有说明。因此,如果目标 IP 无法访问,则会引发此异常。但是,网络上的计算机无法访问的原因可能有很多。我首先想到的是主机被关闭,或者改写EJP的评论:

有许多原因,例如积压队列已满,或可能导致此异常的网络连接问题。

于 2013-01-08T11:07:31.403 回答
0

在大多数情况下,连接超时问题是由于您的 Internet 代理而发生的。确保您已在 IDE 的网络设置以及默认系统代理设置中提供了所有代理设置。

如果问题仍然存在,您必须尝试不使用代理连接...希望对您有所帮助

于 2013-10-18T00:24:02.573 回答