HttpURLConnection:发送 10,000 个请求得到 "Connection reset"
HttpURLConnection: Sending 10,000 requests gives "Connection reset"
我有一个简单的 java 程序,可以在并行线程中向服务器发送 10,000 个 HTTP 请求。
许多请求以成功的 200 OK 响应代码完成,但一些请求失败并显示以下消息:
java.net.SocketException: Connection reset at
java.net.SocketInputStream.read(SocketInputStream.java:196) at
java.net.SocketInputStream.read(SocketInputStream.java:122) at
java.io.BufferedInputStream.fill(BufferedInputStream.java:235) at
java.io.BufferedInputStream.read1(BufferedInputStream.java:275) at
java.io.BufferedInputStream.read(BufferedInputStream.java:334) at
sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:689) at
sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633) at
sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:660) at
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 上的亚马逊 ec2 实例 运行,apache tomcat 7、30G RAM,4 个 CPU。
你基本上是在对机器进行拒绝服务攻击。网络服务器无法处理那么多并发连接,必须中止一些传入尝试。
如果您打算编写这样的工具,它似乎工作得很好。否则,请说明您实际想要完成的任务。
如果你真的发送了 10.000 个请求,我怀疑正在处理你的请求的服务器放弃了一些请求,因为它太忙或者在处理你的请求时遇到了一些其他异常。
我有一个简单的 java 程序,可以在并行线程中向服务器发送 10,000 个 HTTP 请求。
许多请求以成功的 200 OK 响应代码完成,但一些请求失败并显示以下消息:
java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:196) at java.net.SocketInputStream.read(SocketInputStream.java:122) at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) at java.io.BufferedInputStream.read1(BufferedInputStream.java:275) at java.io.BufferedInputStream.read(BufferedInputStream.java:334) at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:689) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:660) at 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 上的亚马逊 ec2 实例 运行,apache tomcat 7、30G RAM,4 个 CPU。
你基本上是在对机器进行拒绝服务攻击。网络服务器无法处理那么多并发连接,必须中止一些传入尝试。
如果您打算编写这样的工具,它似乎工作得很好。否则,请说明您实际想要完成的任务。
如果你真的发送了 10.000 个请求,我怀疑正在处理你的请求的服务器放弃了一些请求,因为它太忙或者在处理你的请求时遇到了一些其他异常。