各位大神,在开发REST接口后,做压力测试时调用接口,并发稍微高一些就出现以下错误:10:01:44,801 ERROR [TechServiceProxy] Call Service:SYSCONFIG error! And exception:java.net.SocketException: Unexpected end of file from server
        at sun.net.www.http.HttpClient.parseHTTPHeader: (HttpClient.java: 774)
        at sun.net.www.http.HttpClient.parseHTTP: (HttpClient.java: 633)
        at sun.net.www.http.HttpClient.parseHTTPHeader: (HttpClient.java: 771)
        at sun.net.www.http.HttpClient.parseHTTP: (HttpClient.java: 633)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream: (HttpURLConnection.java: 1195)
        at java.net.HttpURLConnection.getResponseCode: (HttpURLConnection.java: 379)
        at com.ucloud.paas.proxy.TechServiceProxy.doCall: (TechServiceProxy.java: 301)
        at com.ucloud.paas.proxy.TechServiceProxy.call: (TechServiceProxy.java: 221)
        at com.ucloud.paas.proxy.TechServiceProxy.call: (TechServiceProxy.java: 228)
        at com.ucloud.paas.proxy.sysconfig.EnumConfigService.getEnumType: (EnumConfigService.java: 49)
        at com.unicom.ucloud.eom.commondata.action.CommonDataAction.qryDictData: (CommonDataAction.java: 40)
        at sun.reflect.GeneratedMethodAccessor555.invoke: (null: -1)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke: (DelegatingMethodAccessorImpl.java: 25)
        at java.lang.reflect.Method.invoke: (Method.java: 597)
        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod: (HandlerMethodInvoker.java: 176)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod: (AnnotationMethodHandlerAdapter.java: 436)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle: (AnnotationMethodHandlerAdapter.java: 424)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch: (DispatcherServlet.java: 863)
        at org.springframework.web.servlet.DispatcherServlet.doService: (DispatcherServlet.java: 792)
看了服务器的ulimit 及iptables都没有问题,求大神给个方向。并发server

解决方案 »

  1.   

    10:01:44,801 ERROR [TechServiceProxy] Call Service:SYSCONFIG error! And exception:java.net.SocketException: Unexpected end of file from serverSYSCONFIG 是个什么service?Unexpected end of file from server 意外的结束了?HttpClient.java: 774  使用的httpClient发送的请求? 自己写的?
      

  2.   


    客户端用HttpURLConnection写的:URL url = new URL(serviceURL);
    HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
    setRequestHeader(httpConn, method, headerParams);
    httpConn.setDoOutput(true);
    httpConn.setUseCaches(false);
    httpConn.setRequestProperty("Cache-Control","no-cache"); 
    httpConn.setConnectTimeout(CONNECTION_TIMEOUT);
    httpConn.setReadTimeout(CONNECTION_TIMEOUT);
    if (accept == null) {
    accept = "application/json";
    }
    httpConn.setRequestProperty("Accept", accept);
    if (body != null && !body.equals("")) {
    DataOutputStream dos = new DataOutputStream(
    httpConn.getOutputStream());
    dos.writeBytes(body);
    dos.flush();
    dos.close();
    } else {
    httpConn.connect();
    }两台都是linux机器没有装360
      

  3.   

    50并发就这样了啊?那别费劲了。Node.js, 轻松上2000。用Go 随便写个Server也是2000以上。Java就加服务器吧
      

  4.   


    客户端用HttpURLConnection写的:URL url = new URL(serviceURL);
    HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
    setRequestHeader(httpConn, method, headerParams);
    httpConn.setDoOutput(true);
    httpConn.setUseCaches(false);
    httpConn.setRequestProperty("Cache-Control","no-cache"); 
    httpConn.setConnectTimeout(CONNECTION_TIMEOUT);
    httpConn.setReadTimeout(CONNECTION_TIMEOUT);
    if (accept == null) {
    accept = "application/json";
    }
    httpConn.setRequestProperty("Accept", accept);
    if (body != null && !body.equals("")) {
    DataOutputStream dos = new DataOutputStream(
    httpConn.getOutputStream());
    dos.writeBytes(body);
    dos.flush();
    dos.close();
    } else {
    httpConn.connect();
    }两台都是linux机器没有装360你这代码都不写完整的 httpConn 不接手服务器的响应,也不关掉。。用
    httpConn.disconnect()
      

  5.   


    客户端用HttpURLConnection写的:URL url = new URL(serviceURL);
    HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
    setRequestHeader(httpConn, method, headerParams);
    httpConn.setDoOutput(true);
    httpConn.setUseCaches(false);
    httpConn.setRequestProperty("Cache-Control","no-cache"); 
    httpConn.setConnectTimeout(CONNECTION_TIMEOUT);
    httpConn.setReadTimeout(CONNECTION_TIMEOUT);
    if (accept == null) {
    accept = "application/json";
    }
    httpConn.setRequestProperty("Accept", accept);
    if (body != null && !body.equals("")) {
    DataOutputStream dos = new DataOutputStream(
    httpConn.getOutputStream());
    dos.writeBytes(body);
    dos.flush();
    dos.close();
    } else {
    httpConn.connect();
    }两台都是linux机器没有装360你这代码都不写完整的 httpConn 不接手服务器的响应,也不关掉。。用
    httpConn.disconnect()
    try {
    URL url = new URL(serviceURL);
    HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
    setRequestHeader(httpConn, method, headerParams);
    httpConn.setDoOutput(true);
    httpConn.setUseCaches(false);
    httpConn.setRequestProperty("Cache-Control","no-cache"); 
    httpConn.setConnectTimeout(CONNECTION_TIMEOUT);
    httpConn.setReadTimeout(CONNECTION_TIMEOUT);
    if (accept == null) {
    accept = "application/json";
    }
    httpConn.setRequestProperty("Accept", accept);
    if (body != null && !body.equals("")) {
    DataOutputStream dos = new DataOutputStream(
    httpConn.getOutputStream());
    dos.writeBytes(body);
    dos.flush();
    dos.close();
    } else {
    httpConn.connect();
    }
    int responseCode = httpConn.getResponseCode();
    String str;
    InputStream input;
    if (responseCode == HttpURLConnection.HTTP_OK) {
    input = httpConn.getInputStream();
    } else {
    input = httpConn.getErrorStream();
    }
    BufferedReader br = new BufferedReader(new InputStreamReader(input, "utf-8"));
    str = br.readLine();
    br.close();
    httpConn.disconnect(); long endTime = System.currentTimeMillis();
    long costTime = endTime - startTime;
    if (costTime > 2000) {// cost time more than two second
    // send alarm info to CM
    }
    CallResult cr = new CallResult();
    cr.setStatus(responseCode);
    cr.setBody(str);
    cr.setCosttime(costTime);
    //logCallEvent(serviceName, cr, null);
    TSProxyLogger.info(startTime/1000,serviceName,serviceURL,responseCode,costTime);
    return cr;
    } catch (IOException e) {
    TSProxyLogger.info(startTime/1000,serviceName,serviceURL,0,0L);
    logCallEvent(serviceName, null, e);
    throw new PaasException(e);
    }是完整的,我没有贴全,额 我不会nodejs 哎 痛苦啊
      

  6.   

    跑了一下,访问静态页面,很快,不知道是不是你的服务有什么问题。或者你把代码贴全吧。 直接copy你的代码编译不过。