Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内容的最大长度?_Java_Android_Httpurlconnection - Fatal编程技术网

Java 内容的最大长度?

Java 内容的最大长度?,java,android,httpurlconnection,Java,Android,Httpurlconnection,我正在尝试使用HttpURLConnection与服务器连接,但PUT方法有问题。 我需要发送一个包含1500个字符(或更多)的字符串,但在这种情况下,服务器会产生一个超时并返回500-服务器内部错误 如果发送的字符串少于1400个字符,则没有问题,服务器返回OK 我的代码如下: public String connectToServer(String prototype) { String responseString = ""; try { Buffered

我正在尝试使用
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);
但是服务器的答案是错误的

更新:


我能发现这个问题。出于某种原因,当我尝试在请求中发送大型body时,服务器会产生超时,但不会对所有网络产生超时,仅对某些网络产生超时。我使用安全连接SSL,也许这会带来问题?

我建议您使用Kevin Sawicki提供的非常有用的库


它帮了我很多次

服务器正在响应500-服务器内部错误。因此,您应该检查服务器实现。它应该有超过该内容长度的限制。

我有一个应用程序,做了很多服务器http请求,对我来说,你的问题真的是服务器。主要证据是,您的代码使用的内容少于或等于1415个字符。

可能是网络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

以及您连接的是哪种服务器;您是否具有管理员访问权限,或者管理员是您旁边桌子上的一个友好的人?请尝试添加以下内容:conn.addRequestProperty(“Content-Length”,Content.getLength());我们可以,但是我们应该问什么呢?那部分我不知道@凯拉:我们已经尝试过这种方式,但仍能将信息切割到1415个字符。奇怪的是,当我们发送1416时,我们得到了一个超时,而不是缺少一个字符的消息(这清楚吗?)你能得到一个有线级别的跟踪(使用wireshark、tcpflow或其他什么吗?)我们需要更多的信息来帮助你。你能回答以下问题吗?A->这是什么服务器?(tomcat/JBoss)B->发布HTTP 500的堆栈跟踪。它应该在应用程序日志或服务器日志中可用。C->500是由代码还是容器抛出的?D->发布HTTP请求和响应,结果为500。E->发布处理请求的服务器端代码。我尝试了这个,但得到了相同的答案=(它基于httpUrlConnection,我们已经尝试过了。谢谢。他们说服务器没有限制我在我的手机(3g)中尝试过)该应用程序工作正常,但当我通过全球交叉连接使用wifi连接时,服务器返回“500-服务器内部错误”,这意味着超时。奇怪的是,如果我使用wifi连接手机,但连接另一个ISP(不是全球交叉连接),连接很好是的!最近我才意识到这就是问题所在,谢谢。你知道如何从代码中设置网络MTU吗?不,你不能在代码中设置,因为MTU是在你启动/启用任何网络接口时设置的值。你可以做的是尝试为你的ISP或服务器设置另一个网络配置网卡(或路由器)。谢谢。无论如何,如果你想用另一种解决方案,请让我知道=)我确信MTU不能在代码中更改。这是一个网络的东西。很高兴它帮助了三一