2015-04-08 34 views
0

我有一个简单的Java程序,它向并行线程中的服务器发送10,000个HTTP请求。HttpURLConnection:发送10,000个请求给出“连接重置”

许多完成一个成功的200 OK响应代码,但一些请求失败,出现以下消息请求:

java.net.SocketException异常:连接重置在 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.w ww.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)在 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(); 
       } 
     } 
} 

UPDATE

既然这里的答案指向了这个fac t我的服务器正在中止传入的尝试,我想知道我需要做什么样的服务器调试,以便能够模拟10,000个传入请求。

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

回答

4

你基本上对机器进行拒绝服务攻击。 Web服务器无法处理那么多的同时连接,并且必须中止一些传入的尝试。

如果你打算写这样的工具,它似乎工作得很好。否则,请说明您实际尝试完成的内容。

+0

目标服务器是我的服务器 - 我负载测试与10K并行请求的服务器。我希望我的目标服务器能够为每个10K写入请求提供服务。我应该在该服务器上进行哪些调整,以便能够处理这些请求,而不是重置连接? – Ninja

+3

我们对目标服务器一无所知。这是您需要在您的问题中提供的全部信息。如果问题是关于调整服务器以处理许多请求,为什么您的文章仅包含有关客户端测试工具的信息? –

+0

我问了这个问题,作为您的回答的后续问题,该异常可能是由于Web服务器中止连接。 – Ninja

1

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

+0

我负载测试我的服务器,因此发送10K请求。我将在run()函数中添加更多代码来模拟10K并行http请求触发我的服务器。 – Ninja

+0

@Ninja:测试来自单台计算机的10k同时连接可能不代表真实世界10k同时连接场景......也许分布式JMeter测试会更好地改善它?您可以慢慢加速以查看它开始弯曲的位置 – GPI

相关问题