我正在尝试建立到api端点的持久http连接,该端点在新事件发生时发布分块json响应。我想提供一个回调,每次服务器发送一个新的数据块时调用它,并无限期地保持连接打开。据我所知,HttpClientHttpUrlConnection都不提供此功能。
有没有办法在不使用TCP套接字的情况下实现这一点?

最佳答案

一种解决方案是使用delimeter(如\n\n来分隔每个json事件)。可以在发送之前从原始json中删除空行。调用setChunkedStreamingMode(0)允许读取传入的内容(而不是在缓冲整个请求之后)。然后您可以简单地遍历每一行,存储它们,直到到达一个空行,然后将存储的行解析为json。

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setChunkedStreamingMode(0);
conn.connect();

InputStream is = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuffer sBuffer = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
    if (line.length() == 0) {
        processJsonEvent(sBuffer.toString());
        sBuffer.delete(0, sBuffer.length());
    } else {
        sBuffer.append(line);
        sBuffer.append("\n");
    }
}

08-06 06:24