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();
            }
        }

    }

}

servlet如下:

@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");
}

当我运行这个应用程序时,servlet 的响应是:

收到的数据:t☐☐☐</p>

始终只有第一个字符正确发送到 servlet。相同的代码在 android 上完美运行。任何人都可以帮助我吗?谢谢...

4

2 回答 2

0

我看不出您的代码有明显的问题会导致这种情况。

任何人都可以帮助我吗?

我建议您采取有条不紊的方法来调查问题。使用数据包嗅探器检查实际通过网络发送的内容。检查请求和响应中的实际标头是否正确。检查请求和响应正文是否真的正确编码为 UTF-8 ...

您在调查/证据收集中发现的内容将帮助您找出问题(或问题)发生在哪里......这将使您能够了解您的代码中负责的部分。

于 2014-03-29T01:28:15.293 回答
0
request.getInputStream().read(bytes);

您可能需要循环读取。至少,检查已经读取了多少字节。除第一个字符外,该数组似乎为空。

从输入流中读取一些字节并将它们存储到缓冲区数组 b. 实际读取的字节数以整数形式返回。在输入数据可用、检测到文件结尾或引发异常之前,此方法会一直阻塞。

于 2014-03-29T01:24:32.213 回答