【问题标题】:Java HttpUrlConnection connection time out is not working due to connection refused由于连接被拒绝,Java HttpUrlConnection 连接超时不起作用
【发布时间】:2014-01-06 07:44:45
【问题描述】:

您好,我正在开发 Java 应用程序并部署在 Jboss,Windows 8 服务器上。在我的服务器代码中,我使用HttpUrlconnection 与我的产品进行通信。

我想为每个连接与我的产品连接设置一个时间限制。所以我使用HttpUrlconnection.setconnectionTimeout(30000) 30 秒的时间限制。但连接已在 9 分钟时被拒绝。 HttpUrlconnection.setconnectionTimeout() 目前不工作。

我发现了windows 8 server中TCP超时和重传限制设置的问题。默认情况下 TCP 重传限制为 2。尝试 2 次后,连接将被放弃或拒绝。

我的问题是如何在不更改 Windows 注册表文件的情况下从 java 端避免这个问题?这意味着可以设置超时或重试 TCP SYN/RST/ACK 机制以避免连接被拒绝问题。

有谁知道,请帮我解决这个问题

url = new URL(requestURL);
HttpURLConnection connection = (HttpURLConnection)  
url.openConnection();
connection.setRequestMethod("GET");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setConnectTimeout(30000
connection.setReadTimeout(30000;

try {
    // Get Response
    inputStream = connection.getInputStream();
} catch (IOException e) {
    //              
}

异常如下

java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.<init>(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.http.HttpClient.New(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)

【问题讨论】:

  • connection.setConnectTimeout(30000connection.setReadTimeout(30000; 是否只有错误?

标签: java sockets tcp httpurlconnection httpconnection


【解决方案1】:

连接被拒绝意味着连接的另一端没有程序可以侦听/期望您的连接。如果您的产品稍后会打开,则需要手动重试连接;无需等待即可进行“延迟”连接尝试,以便在程序启动时连接。

老实说,您的连接逻辑似乎是向后的:看起来您正在尝试从长时间运行的程序(服务器)连接到短期运行的程序(客户端);反过来,让服务器监听连接,客户端在启动时应该连接到服务器。

【讨论】:

    【解决方案2】:

    连接超时适用于根本没有响应的情况。连接拒绝是响应,因此超时不适用。

    【讨论】:

    • 嗨。我明白你的意思。但由于防火墙或其他一些原因,我无法连接我的设备。当时当我调用 http 请求时,它会在调用 java.net.PlainSocketImpl.socketConnect(Native Method) 时通过 TCP 向设备发送 SYN 数据包。它试图从设备获得确认。它只尝试两次。因为windows注册的TcpMaxDataRetransmissions是2。两次失败后它放弃请求。所以发生异常。是否可以通过java延长重试或延长TCP超时?
    • 我无法理解这一点。我只能重复。如果在超时过去之前有任何类型的响应,则超时不适用。这包括 SYN/ACK 和 RST。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2021-04-24
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    相关资源
    最近更新 更多