2013-01-08 97 views
2

任何机构可以解释java.net.ConnectException:连接超时如何防止java.net.ConnectException:连接超时?

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) 
+0

这是一个数据库连接错误。你可以做一个telnet到你的数据库服务器和端口? –

+0

是的,我试图访问远程系统。所以我有连接超时你能给我解决方案我 – sivaram

+0

你可以尝试ping服务器?另一个问题可能是SQL Server需要您手动启用TCP/IP协议,如果您想从联网系统连接。 –

回答

1

这意味着司机试图打开该端口连接到IP,但有没有 监听一个端口 上,所以没有人回答“连接超时”消息。

由于Arunn P约翰尼拉建议,如果你打开一个命令行,并运行

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 '^]'. 

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

很可能您的数据库中的IP和端口号为 connection string(请参阅 reference)是错误的,例如,设置为某个没有数据库正在侦听的端口。

看到这个answer和解释HTTP Error 408 Request timeout(这是同样的错误)。

编辑:

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

  • Connection refused意味着存在意味着连接不能建立,或由EJP该连接的声明没有人听的给定端口
  • Connection timeout上尝试超时。

假设你在Java中,以下行,最终JDBC驱动程序(像),这在某些时候:之前该行执行(TCP)连接

Socket s = new Socket(IP,PORT); 

关闭此行得到执行,并且没有发生异常,连接是建立(如在apidoc for constructor中所述)。 虽然该行执行,这是实际发生的事情(它被称为TCP三次握手):

TCP threeway handshake

让我们回顾一下两种可能的情况。首先,我们假设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 for connect method还指出。因此,如果目标IP不可访问,则会抛出此异常。然而,网络上的计算机的不可达性的原因可能很多。我想到的第一件事情是主机已关闭,或者重新考虑EJP的评论:

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

+2

'连接超时'并不意味着没人在倾听。这会导致'连接被拒绝',就像在你自己的测试中一样。这意味着连接尝试超时,可能有多种原因,如积压队列填满或网络连接问题。 – EJP

+0

感谢您的输入,请查看更新。 – linski

+0

@EJP感谢您的输入,请查看更新。 – linski

1

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

您可以参考this question on how to enable TCP/IP也可以参考微软的thisthis文章。

  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服务。
0

在大多数情况下,由于您的互联网代理服务器出现连接超时问题。 确保您已在IDE的网络设置中提供了所有代理设置以及默认的系统代理设置。

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

相关问题