gpt4 book ai didi

java.net.SocketTimeoutException 与 java.net.ConnectException

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:24:27 25 4
gpt4 key购买 nike

当使用 Java 客户端套接字连接到服务器时,我遇到了这两个不同的连接超时异常。

Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:381)

Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)

我检查了文档,但对于 SocketTimeoutException,它写的是“在套接字读取或接受上发生超时的信号”,但这不是我的情况。因为我是在建立连接的过程中得到它的。

这两个异常之间有什么区别?实际上我期待在任何连接问题(防火墙、端口关闭等)中得到 ConnectException

最佳答案

同样是来这里找答案的,貌似the docs很容易被误解:

Connects this socket to the server with a specified timeout value. A timeout of zero is interpreted as an infinite timeout. The connection will then block until established or an error occurs.

我在此忽略的关键部分是“错误”...转到the source我可以看到 Java 的 connect() 实际上是如何调用 Linux connect() 的:

if (timeout <= 0) {
connect = connect(args...);
if (connect == -1 && errno == EINPROGRESS) {
connect = poll(args...);
// try again on EINTR
}
} else {
// Go to non-blocking mode for a timeout.
connect = connect(args...);

if (connect!=0) {
// not EINPROGRESS? -> throw ConnectException
while (!connect || !error || timedout) {
connect = poll(args...);
// error / timedout handling
}
if (timedout) {
// throw SocketTimeoutException
}
}
}

/* report the appropriate exception */
if (error) {
//EINVAL; throw SocketException
//EINTR; throw InterruptedIOException
//EPROTO; throw ProtocolException
//ECONNREFUSED;ETIMEDOUT; throw ConnectException
//EHOSTUNREACH; throw NoRouteToHostException
//EADDRNOTAVAIL; throw NoRouteToHostException
//EISCONN, EBADF, other; throw SocketException
}

即我认为 SocketTimeoutException 是在网络速度慢或主机根本没有响应时抛出的。检查 man connect,我可以看到当“No-one listening on the remote address”时必须抛出 ECCONNREFUSED,即 ICMP 告诉我们的。

这意味着,如果像我一样,您尝试使用 timeout 连接到尚未准备好连接的(本地主机)套接字,那么您就完蛋了。

关于java.net.SocketTimeoutException 与 java.net.ConnectException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24116625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com