简体   繁体   English

当响应大小很大时,来自Android的HTTP POST不返回数据

[英]HTTP POST from Android not return data when response size big

I have a problem when fire a POST request to server and after process server response result but when server write data sometime data can't transfer to client, dead at writer.write() function. 当向服务器发出POST请求并处理服务器响应结果后出现问题,但是当服务器写入数据有时无法将数据传输到客户端时,我在writer.write()函数中死了。 I use Apache Tomcat to deploy app, each time server need response about 7m data before gzip and 300k after gzip 我使用Apache Tomcat部署应用程序,每次服务器需要在gzip之前响应大约7m数据,在gzip之后需要响应300k

Please Help ! 请帮忙 !

my code: 我的代码:

protected void dispatch(JSONObject request,
              Map<String, FormDataItem> formItems,
              HttpServletRequest servletRequest,
              HttpServletResponse servletResponse, SecurityToken token,
              String callback) throws JSONException, IOException {
        long timeGetData = 0;
        long begin = System.currentTimeMillis();

        String key = null;

        if (request.has("id")) {
              key = request.getString("id");
        }

        // getRpcHandler never returns null
        Future<?> future = getHandler(request, servletRequest).execute(
                    formItems, token, jsonConverter);

        timeGetData = System.currentTimeMillis();
        // Resolve each Future into a response.
        ResponseItem response = getResponseItem(future);
        ResponseItem responseTemp = (ResponseItem) response.getResponse();

        // Generate the output
        Writer writer = servletResponse.getWriter();

        if ("syndata.getAllDataFromServer".equals(request.getString("method"))) {
              if (responseTemp.getErrorCode() == 200) {
                    SynDataObject outObject = (SynDataObject) (responseTemp
                                .getResponse());
                    writer.write(jsonConverter.convertToString(outObject
                                .getParams()));
                    writer.write("\r\n");

                    for (int i = 0; i < outObject.getListTableData().size(); i++) {
                          TableDataObject subData = outObject.getListTableData().get(
                                      i);
                          int subDataLength = subData.getData().size();
                          int currentFarm = 0;
                          int factor = 1000;
                          int lastIndex = 0;

                          while (lastIndex < subDataLength) {
                                if ((currentFarm * factor + factor) > subDataLength) {
                                      lastIndex = (factor * currentFarm)
                                                  + (subDataLength - (factor * currentFarm));
                                } else {
                                      lastIndex = (factor * currentFarm) + factor;
                                }

                                TableDataObject chilData = new TableDataObject();
                                chilData.setTableName(subData.getTableName());
                                chilData.setTableColumns(subData.getTableColumns());
                                chilData.setPkField(subData.getPkField());

                                 chilData.setData(subData.getData().subList(
                                            currentFarm * factor, lastIndex));


                                writer.write(jsonConverter.convertToString(chilData));
                                writer.write("\r\n");
                                writer.flush();

                                ++currentFarm;
                          }
                    }
              } else {
                    Object result = getJSONResponse(key, response);
                    String content = jsonConverter.convertToString(result);

                    if (callback != null) {
                          writer.write(callback);
                          writer.write('(');
                    }

                    writer.write(content);

                    if (callback != null) {
                          writer.write(");\n");
                    }
              }
        } else {
              Object result = getJSONResponse(key, response);
              String content = jsonConverter.convertToString(result);

              if (callback != null) {
                    writer.write(callback);
                    writer.write('(');
              }

              writer.write(content);

              if (callback != null) {
                    writer.write(");\n");
              }
        }

  }

Each browser has some request timeout value. 每个浏览器都有一些请求超时值。 If the time taken to serve the request or the time taken to reach the writer.write() line exceeds, the client connection gets closed. 如果处理请求的时间或到达writer.write()行的时间超过了,则客户端连接将关闭。

So u won't be able to write any info to writer. 因此,您将无法向作家写任何信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM