开发者社区 问答 正文

socket怎么接收HttpServletResponse返回的json字符串? 400 请求报错

response.setContentType("text/json;charset=utf-8");//json 的编码
			out =response.getWriter();
			String jsonStr = new Gson().toJson(map);
			logger.info("返回json:"+jsonStr);
			out.print(jsonStr);
上面是服务端处理请求以后返回json到输出流。 客户端是socket模拟http协议发送的请求。请问socket客户端怎么获得这个json字符串呢?客户端把输入流用BufferedReader都打印了也没看到这个json

展开
收起
kun坤 2020-05-29 11:53:48 1297 分享 版权
阿里云 AI 助理回答

在客户端使用Socket模拟HTTP协议发送请求并接收服务器返回的JSON数据时,你需要正确处理从服务器读取的数据流。由于你已经将输出流的内容打印出来但没有看到预期的JSON字符串,这可能是因为数据读取的方式或解析逻辑存在问题。下面是一个简化的示例,展示如何在客户端用Java的Socket来接收并解析服务器返回的JSON字符串:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class SocketClientExample {
    public static void main(String[] args) {
        try (Socket socket = new Socket("your_server_ip", your_server_port); // 替换为你的服务器IP和端口
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {

            // 发送HTTP请求头(这里简化处理,实际应构造完整的HTTP请求)
            String request = "GET /your_endpoint HTTP/1.1\r\n" +
                             "Host: your_server_host_or_ip\r\n" +
                             "Connection: close\r\n\r\n"; // 根据实际情况调整
            out.println(request);

            // 读取响应
            StringBuilder responseBuilder = new StringBuilder();
            String line;
            while ((line = in.readLine()) != null) {
                responseBuilder.append(line).append("\n");
                // 查找结束标记,HTTP响应通常以空行结束响应头部分
                if (line.trim().isEmpty()) {
                    break; // 跳出循环开始读取实体内容(即你的JSON数据)
                }
            }

            // 继续读取直到数据完全读取完毕,这里简单地假设JSON数据直接跟在响应头之后
            String responseBody = "";
            while ((line = in.readLine()) != null) {
                responseBody += line;
            }

            // 打印接收到的JSON数据
            System.out.println("Received JSON: " + responseBody);

            // 这里可以进一步解析responseBody作为JSON对象处理

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

请注意以下几点: 1. 替换服务器信息:确保替换your_server_ipyour_server_port以及请求中的其他必要信息。 2. 构建正确的HTTP请求:上述代码中发送的HTTP请求非常基础,实际应用中可能需要根据服务端要求添加更多的头部信息,如Content-Type等。 3. 处理响应:服务器响应包括响应头和响应体两部分,示例代码通过寻找空行来区分这两部分。实际操作中,你可能需要更精确的解析逻辑,特别是处理分块传输编码等复杂情况。 4. JSON解析:一旦成功获取到JSON字符串,你可以使用诸如org.json.JSONObjectcom.google.gson.JsonObject等库来解析这个字符串。

如果按照上述方式仍然无法获取到JSON数据,请检查服务器端是否正确设置了响应内容类型及编码,并确认服务器确实返回了预期的数据。此外,网络连接的稳定性和防火墙设置也可能是影响因素。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答