java关闭网络连接超时_如何防止java.net.ConnectException:连接超时?

这意味着司机试图打开该端口连接到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三次握手):

ge2P0.jpg

让我们回顾一下两种可能的情况。首先,我们假设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的评论:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值