【问题标题】:Maximum length of content?内容的最大长度?
【发布时间】:2013-03-15 13:35:32
【问题描述】:

我正在尝试使用HttpURLConnection 连接服务器,但我的 PUT 方法有问题。
我需要发送 1500 个字符(或更多)的字符串,但在这种情况下,服务器会产生超时并返回 500 - 服务器内部错误
如果我发送的字符串小于1400 个字符,我没有问题,服务器返回OK

我的代码如下:

public String connectToServer(String prototype) {
    String responseString = "";

    try {
        BufferedReader in = new BufferedReader(new InputStreamReader(openURLForInput(new URL(URL), USERNAME, PASSWORD, prototype)));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
            responseString += line;
        }

    } catch (IOException e) {
        e.printStackTrace();
        responseString = e.toString();
    }

    return responseString;
}

//-----------

public InputStream openURLForInput(URL url, String uname, String pword, String content) throws IOException {
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setDoInput(true);
    conn.setDoOutput(true);
    conn.setRequestProperty("Authorization", userNamePasswordBase64(uname, pword)); // I know this is OK
    conn.addRequestProperty("Content-type", "application/xml; charset=utf-8");

    //conn.setChunkedStreamingMode(8 * 1024);

    conn.setRequestMethod("PUT");
    conn.connect();

    OutputStream output = conn.getOutputStream();
    OutputStreamWriter osw = new OutputStreamWriter(output, "UTF-8");
    BufferedWriter writer = new BufferedWriter(osw);
    writer.write(content); // content length  > 1400 characters
    writer.close();
    output.close();

    int status = conn.getResponseCode();
    Log.i("STATUS", status + "");
    Log.i("STATUS_ERROR", conn.getResponseMessage());

    return conn.getInputStream();
}

我尝试添加线条

conn.setFixedLengthStreamingMode(contentLength)
conn.setChunkedStreamingMode(8 * 1024);

但无论如何服务器的回答是错误的。

更新:

我可以检测到问题。出于某种原因,当我尝试在请求中发送大型正文时,服务器会产生超时但并非针对所有网络,仅针对某些网络。我使用的是安全连接 SSL,也许这会带来问题?

【问题讨论】:

  • 你连接的是什么类型的服务器;你有管理员权限吗?还是管理员在你旁边的桌子上是个友好的人?
  • 尝试添加这个:conn.addRequestProperty("Content-Length", content.getLength());
  • Class Stacker:我们可以,但是我们应该问什么?那部分我不知道。 @Kylar:我们已经尝试过这种方式,但仍然将消息减少到 1415 个字符。奇怪的是我们在发送 1416 时得到了 TimeOut,而不是缺少 1 个字符的消息(这清楚吗?)
  • 你能得到一个线级跟踪吗(使用wireshark、tcpflow或其他东西?)
  • 我们需要更多信息来帮助您。你能回答以下问题吗? A -> 这是什么服务器? (tomcat / JBoss) B -> 发布 HTTP 500 的堆栈跟踪。它应该在应用程序日志或服务器日志中可用。 C -> 500 是代码还是容器抛出的? D -> 发布导致 500 的 HTTP 请求和响应。 E -> 发布处理请求的服务器端代码。

标签: java android httpurlconnection


【解决方案1】:

也许这是一个网络 MTU 问题,我会说你在这方面进行调查。

这是一个与 windows 相关的表格:

Network             MTU (bytes)
-------------------------------
16 Mbps Token Ring        17914
4 Mbps Token Ring          4464
FDDI                       4352
Ethernet                   1500
IEEE 802.3/802.2           1492
PPPoE (WAN Miniport)       1480
X.25                        576

【讨论】:

  • 是的!最近我才意识到这是问题所在,谢谢。你知道如何从代码中设置网络 MTU 吗?
  • 不,您不能在代码中设置它,因为 MTU 是在您拥有的任何网络接口启动/启用时设置的值。您可以做的是尝试为您的 ISP 或网卡(或路由器)设置另一个网络配置。
  • 谢谢。无论如何,如果您认为有其他解决方案,请告诉我 =)
  • 我确定不能在代码中更改 MTU。是网络的事。很高兴它对三一有所帮助
【解决方案2】:

我建议您使用 Kevin Sawicki 提供的非常有用的 HTTP-REQUEST 库...

它帮助了我很多次!

【讨论】:

  • 我试过了,但得到了相同的答案 =( 它基于 httpUrlConnection,我们已经尝试过了。谢谢。
【解决方案3】:

服务器正在响应 500 - 服务器内部错误。所以你应该检查服务器的实现。它应该有超过该内容长度的限制。
我有一个执行大量服务器 http 请求的应用程序,对我来说,您的问题确实是服务器。主要证据是您的代码可以处理小于或等于 1415 个字符的内容。

【讨论】:

  • 他们说服务器没有限制
  • 我在我的手机 (3g) 中尝试过,该应用程序运行良好,但是当我通过全局交叉连接使用 wifi 连接时,服务器返回“500 - 服务器内部错误”,这意味着超时。奇怪的是,如果我使用 wifi 连接我的手机,但使用另一个 ISP(不是 Global Crossing),则连接工作正常
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
相关资源
最近更新 更多