0

私の Java アプリケーションでは、Httpsurlconnection を使用して文字列データをサーバーに送信しました。このコードを Android でテストすると、完全に動作します。ただし、Java アプリケーションでは機能しません。クライアント Java アプリケーションは次のとおりです。

public static void main(String[] args) {

    disableSslVerification();
    new HttpsClient().testIt();
}

private void testIt() {

    String https_url = "https://XXX.XX.XXX.XXX:XXXX/XXXXX/TestServlet";
    URL url;
    try {

        url = new URL(https_url);
        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
        print_content(con, "test");

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

private void print_content(HttpsURLConnection connection, String data) {
    if (connection != null) {

        try {
            connection.setConnectTimeout(6000);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            Charset cSet = Charset.forName("UTF-8");
            byte bytes[] = data.getBytes(cSet);
            connection.setRequestProperty("Content-Length", ""
                    + Integer.toString(bytes.length));
            connection.setRequestProperty("Content-Language", "tr");
            connection.setRequestProperty("Accept-Charset", "UTF-8");

            connection.setUseCaches(false);
            connection.setDoInput(true);
            connection.setDoOutput(true);

            DataOutputStream wr = new DataOutputStream(
                    connection.getOutputStream());

            wr.write(bytes);
            wr.flush();
            wr.close();

            InputStream is = connection.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is, cSet));
            String line;
            StringBuilder response = new StringBuilder();
            while ((line = rd.readLine()) != null) {
                response.append(line);
                response.append(System.getProperty("line.separator"));
            }
            rd.close();
            System.out.println(response.toString());

        } catch (Exception e) {
            System.out.println(e.getMessage());

        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }

    }

}

そして、サーブレットは次のとおりです。

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    String s = getHTML(request);
    try {
        out.print("received data:");
        out.print(s);
    } finally {            
        out.close();
    }
}

private String getHTML(HttpServletRequest request) throws IOException {
    int n = request.getContentLength();
    if (n < 1) {
        return "";
    }

    byte bytes[] = new byte[n];
    request.getInputStream().read(bytes);
    return new String(bytes, "UTF-8");
}

このアプリケーションを実行すると、サーブレットの応答は次のようになります。

受信データ:t☐☐☐</p>

常に最初の文字のみがサーブレットに正しく送信されます。同じコードが Android でも完璧に機能します。誰でも私を助けてもらえますか?ありがとう...

4

2 に答える 2

0
request.getInputStream().read(bytes);

この読み取りをループで行う必要がある場合があります。少なくとも、読み取られたバイト数を確認してください。配列は、最初の文字を除いて空のように見えます。

入力ストリームからいくつかのバイトを読み取り、それらをバッファ配列 b に格納します。実際に読み取られたバイト数は整数として返されます。このメソッドは、入力データが使用可能になるか、ファイルの終わりが検出されるか、例外がスローされるまでブロックされます。

于 2014-03-29T01:24:32.213 に答える
0

あなたのコードには、これを引き起こす明らかな問題は見当たりません。

誰でも私を助けてもらえますか?

問題を調査するために系統的なアプローチを取ることをお勧めします。パケット スニファーを使用して、実際に何が送信されているかを確認します。リクエストとレスポンスの実際のヘッダーが正しいことを確認してください。リクエストとレスポンスの本文が本当に適切にエンコードされた UTF-8 であることを確認してください ...

調査/証拠収集で見つけたものは、問題 (または問題) がどこで発生しているかを把握するのに役立ちます...そして、責任がある/あるコードの部分に焦点を合わせることができます.

于 2014-03-29T01:28:15.293 に答える