这意味着司机试图打开该端口连接到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)是错误的,例如,设置为某个没有数据库正在侦听的端口。
编辑:
我最初给了一个错误的答案(如EJP指出)。这两个错误在TCP层发生,同时建立连接:
Connection refused意味着存在意味着连接不能建立,或由EJP该连接的声明没有人听的给定端口
Connection timeout上尝试超时。
假设你在Java中,以下行,最终JDBC驱动程序(像),这在某些时候:之前该行执行(TCP)连接
Socket s = new Socket(IP,PORT);
是关闭。 此行得到执行,并且没有发生异常,连接是建立(如在apidoc for constructor中所述)。 虽然该行执行,这是实际发生的事情(它被称为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 for connect method还指出。因此,如果目标IP不可访问,则会抛出此异常。然而,网络上的计算机的不可达性的原因可能很多。我想到的第一件事情是主机已关闭,或者重新考虑EJP的评论:
有很多原因,例如积压队列填满或网络连接问题可能导致此异常。



