【问题标题】:HttpURLConnection: Sending 10,000 requests gives "Connection reset"HttpURLConnection:发送 10,000 个请求会给出“连接重置”
【发布时间】:2015-06-13 04:54:02
【问题描述】:

我有一个简单的 java 程序,它以并行线程向服务器发送 10,000 个 HTTP 请求。

许多请求以成功的 200 OK 响应代码完成,但有些请求失败并显示以下消息:

java.net.SocketException:连接重置于 java.net.SocketInputStream.read(SocketInputStream.java:196) 在 java.net.SocketInputStream.read(SocketInputStream.java:122) 在 java.io.BufferedInputStream.fill(BufferedInputStream.java:235) 在 java.io.BufferedInputStream.read1(BufferedInputStream.java:275) 在 java.io.BufferedInputStream.read(BufferedInputStream.java:334) 在 sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:689) 在 sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633) 在 sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:660) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1324)

我的代码是:

import java.io.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.DataOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.*;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONArray;
import java.io.OutputStreamWriter;
import java.io.DataOutputStream;

public class CreateUsers {

        public static void main(String[] args){
                System.out.println(Thread.currentThread().getName());

                for(int i=0; i<10000; i++){
                        final int cnt = i;
                        new Thread("" + i){
                                public void run(){
                                        try {
                                                 String url = "http://myurl.com"; //I use my actual server url here
                                                URL object=new URL(url);
                                                HttpURLConnection con = (HttpURLConnection) object.openConnection();
                                                con.setDoOutput(true);
                                                con.setRequestMethod("POST");
                                                con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");

                                                JSONObject parent=new JSONObject();
                                                JSONObject all_users=new JSONObject();
                                                all_users.put("user_name", "abc");
                                                all_users.put("email", "test"+cnt+"@test.com");

                                                JSONArray users = new JSONArray();
                                                users.put(all_users);
                                                parent.put("users", users);
                                                OutputStream os = con.getOutputStream();
                                             os.write(parent.toString().getBytes("UTF-8"));
                                                os.close();

                                                int responseCode = con.getResponseCode();
                                                System.out.println("\nSending 'POST' request to URL : " + url);
                                                System.out.println("Response Code : " + responseCode);
con.disconnect();

                                        }
                                        catch (Exception e) {e.printStackTrace();}

                                }
                        }.start();
                }
        }
}

更新

由于这里的答案表明我的服务器正在中止传入尝试,我想知道我需要做什么样的服务器调整才能模拟 10,000 个传入请求。

我的服务器是运行在 ubuntu、apache tomcat 7、30G RAM、4 个 CPU 上的 amazon ec2 实例。

【问题讨论】:

    标签: java httpurlconnection


    【解决方案1】:

    如果您真的发送了 10.000 个请求,我怀疑处理您的请求的服务器放弃了一些请求,因为它太忙或在处理您的请求时遇到了其他异常。

    【讨论】:

    • 我正在对我的服务器进行负载测试,因此发送了 10K 请求。我将向 run() 函数添加更多代码,以模拟 10K 并行 http 请求访问我的服务器。
    • @Ninja:测试来自单台计算机的 10k 并发连接可能无法代表真实世界的 10k 并发连接场景......也许分布式 JMeter 测试会更好?你可以慢慢把它拉高,看看它从哪里开始弯曲
    【解决方案2】:

    您基本上是在对机器进行拒绝服务攻击。网络服务器无法处理这么多的同时连接,必须中止一些传入的尝试。

    如果您打算编写这样的工具,它似乎工作得很好。否则,请说明您实际想要完成的任务。

    【讨论】:

    • 目标服务器是我的服务器 - 我正在使用 10K 并行请求对服务器进行负载测试。我希望我的目标服务器能够为每一个 10K 写请求提供服务。我应该在该服务器上进行哪些调整,以便能够处理这些请求而不重置连接?
    • 我们对目标服务器一无所知。这是您需要在问题中提供的一整类信息。如果问题是关于调整服务器以处理许多请求,为什么您的帖子只包含有关客户端测试工具的信息?
    • 我问这个问题是为了跟进您的回答,即异常可能是由于网络服务器中止连接。
    • 我正在用我的服务器上的详细信息更新问题
    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2012-02-04
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多