【问题标题】:HttpUrlConnection connection reset error when sending second message发送第二条消息时 HttpUrlConnection 连接重置错误
【发布时间】:2018-10-31 11:30:00
【问题描述】:

基本上就是这样,发送的第一条消息被服务器正确接收,但接下来的所有消息都失败了。这是迭代消息并处理一些错误以进行代码调试和逻辑的主循环。变量 udc 是我的数据库连接,但它工作正常,所以忽略它。

for (MessageOutModel message : messageOutModels) {
    HttpURLConnection connection = MakeConnection();
    Date currentMoment = new Date(Calendar.getInstance().getTimeInMillis());
    System.out.println("Sent message id: " + message.id);
    OutputStreamWriter out = new OutputStreamWriter(
            connection.getOutputStream());
    out.write(message.contenido);
    out.close();
    //os.write(message.contenido);
    System.out.println("Message sent");
    int responseCode = connection.getResponseCode();
    System.out.println("Connection message: " + responseCode);
    message.f_ultimo_intento = currentMoment;
    if (responseCode != 200) {
        message.intentos++;
        message.desc_error = "Connection error: " + responseCode
                + " Connection error message: " + connection.getResponseMessage() + "Response error:" +
                connection.getResponseMessage();
       udc.UpdateMessageOut(message);
       if (message.intentos == configModel.n_reintentos) {
           udc.InsertError("MAX_INTENTOS", "Se ha alcanzado el máximo número de " +                         "intentos para el id-ticket: " + message.id + "-" + message.ticket_number);
       }
    } else {
        message.desc_error = "";
        udc.UpdateMessageOut(message);
    }
    connection.disconnect();
}

这里有 MakeConnection() 方法

protected HttpURLConnection MakeConnection() throws IOException {
    QName q = new QName(SERVER_URL, "");
    URL url = new URL(q.getNamespaceURI() + q.getLocalPart());
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setDoOutput(true);
    connection.setInstanceFollowRedirects(false);
    connection.setRequestProperty("UserName", Username);
    connection.setRequestProperty("PassWord", Password);
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", MediaType.TEXT_PLAIN);
    return connection;
}

Connection reset error

【问题讨论】:

  • 也许您应该尝试将连接移到循环之外。与外部服务建立连接可能是代码执行中最慢的部分。

标签: java sockets client-server httpurlconnection


【解决方案1】:

将此作为快速解决方案。

HttpURLConnection connection = MakeConnection();

for (MessageOutModel message : messageOutModels) {
  // logic from your sample
}
connection.disconnect();

另外,您可以使用try-with-resources 来稍微改进设计。

【讨论】:

  • 感谢资源的尝试,我会的。关于forloop,我们需要为每个请求建立一个连接,所以结构是正确的,
  • 嗯.. 明白了。也许你需要创建一个像ConnectionManager 这样的服务来防止'handshake-DDOS'?我不确定,但在每次迭代中使用新连接真的很重要吗? @m5m7n5
【解决方案2】:

最终导致客户端和服务器出现防火墙问题。在第一次之后,它每隔一段时间就会阻塞连接。

【讨论】:

    猜你喜欢
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多