4

を使用してサーバーに接続しようとしていますHttpURLConnectionが、PUT メソッドに問題があります。1500 文字
(またはそれ以上) の文字 列を送信する必要がありますが、この場合、サーバーはタイムアウトを生成し、500 - server internal errorを返します。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 を使用していますが、問題が発生する可能性がありますか?

4

3 に答える 3

2

ネットワーク MTU の問題かもしれません。その点について調査してください。

ウィンドウに関連する表を次に示します。

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
于 2013-03-21T17:22:56.600 に答える
0

サーバーは 500 に応答しています - サーバー内部エラー。したがって、サーバーの実装を確認する必要があります。そのコンテンツの長さを超える制限が必要です。
私は多くのサーバー http リクエストを実行するアプリを持っていますが、私にとってあなたの問題は本当にサーバーです。主な証拠は、コードが 1415 文字以下のコンテンツで機能することです。

于 2013-03-20T03:16:45.323 に答える
0

Kevin Sawicki による非常に役立つHTTP-REQUESTライブラリを使用することをお勧めします...

何度も助けてくれました!

于 2013-03-15T13:49:04.587 に答える