内容的最大长度是多少?

4
我正在尝试使用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,这可能会带来问题?


你连接的是什么类型的服务器?你是否拥有管理员访问权限,或者管理员是坐在你旁边的友好人士? - class stacker
尝试添加以下内容:conn.addRequestProperty("Content-Length", content.getLength()); - Kylar
类堆栈:我们可以,但我们应该问什么?我不知道那部分。@Kylar:我们已经尝试过那种方式,仍然收到1415个字符的消息截断的消息。奇怪的是,当我们发送1416时,我们会收到超时而不是缺少1个字符的消息(这清楚吗?) - SolArabehety
你能获取线级跟踪吗?(使用wireshark、tcpflow或其他工具?) - Kylar
我们需要更多信息来帮助您。您能回答以下问题吗?A->这是什么服务器?(Tomcat / JBoss)B->发布HTTP 500的堆栈跟踪。它应该在应用程序日志或服务器日志中可用。C->500是由代码还是容器抛出的?D->发布导致500的HTTP请求和响应。E->发布处理请求的服务器端代码。 - Deepak Bala
A. TomcatB. Logcat异常:http连接错误ch.boye.httpclientandroidlib.NoHttpResponseException:目标服务器未响应C. 我不知道。我们无法访问那种类型的信息。我们能从中获得什么信息?D. 上面是我的代码中的http请求E. 我无法访问服务器的代码。 - SolArabehety
3个回答

2
也许是网络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吗? - SolArabehety
不,你不能在代码中设置MTU,因为MTU是在你所拥有的任何网络接口启动/启用时设置的值。你可以尝试为你的ISP或网络卡(或路由器)设置另一个网络配置。 - Carlos Castillo
谢谢。如果您有其他解决方案,请告诉我 =) - SolArabehety
我相信MTU不能在代码中更改。这是一个网络问题。很高兴它对Sany有帮助。 - Carlos Castillo

0

我建议您使用由Kevin Sawicki开发的非常有用的HTTP-REQUEST库...

它帮助了我很多次!


我尝试了这个,但是得到了相同的答案 =( 它基于httpUrlConnection,我们已经尝试过了。谢谢。 - SolArabehety

0
服务器响应500 - 服务器内部错误。因此,您应该检查服务器的实现。它应该对内容长度有限制。
我有一个应用程序,它执行大量的服务器HTTP请求,对我来说,您的问题确实是服务器问题。主要证据是您的代码适用于长度小于或等于1415个字符的内容。

他们说服务器没有限制。 - SolArabehety
我在我的手机(3G)上尝试了一下,应用程序运行良好。但是当我通过Global Crossing连接使用WiFi进行连接时,服务器返回“500-服务器内部错误”,这意味着超时。奇怪的是,如果我使用另一个ISP(而不是Global Crossing)连接我的手机使用WiFi,则连接正常工作。 - SolArabehety

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接