Android不依赖okhttp处理SSE流式接口(如AI逐句回复)

参考别的前辈的代码,忘记在哪里看的了
InputStream is = null;
try {
    //1.设置URL
    URL url = new URL("http://.../chat");
    //2.打开URL连接
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    //3.设置请求方式
    conn.setRequestMethod("POST");
    //4.设置Content-Type
    conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
    //5.设置Accept
    conn.setRequestProperty("Accept", "text/event-stream");
    //6.设置DoOutput
    conn.setDoOutput(true);
    //7.设置DoInput
    conn.setDoInput(true);
    //8.获取输出流
    OutputStream os = conn.getOutputStream();
    //9.写入参数(json格式)
    os.write(new Gson().toJson(aiAskBean).getBytes("utf-8"));
    os.flush();
    os.close();
    //10.获取输入流
    is = conn.getInputStream();
    byte[] bytes = new byte[1024];
    int len = 0;
    while ((len = is.read(bytes)) != -1) {
        String line = new String(bytes, 0, len, "utf-8");
        //line就是每行的数据了,也就是“逐句”
    }
} catch (IOException e) {
    e.printStackTrace();
    
} finally {
    if (!Objects.isNull(is)) {
        try {
            //12.关闭输入流
            is.close();
            
        } catch (IOException e) {
            e.printStackTrace();
           
        }
    }

}

Android 开发中,如果想使用 OkHttpSSE(Server-Sent Events,服务器发送事件)功能,可以借助 `okhttp-sse` 提供的 `EventSource` 类。以下是具体的依赖配置和使用介绍。 --- ### 添加依赖 要在项目中使用 `okhttp3.sse.EventSource`,需要先将 OkHttp 和其 SSE 扩展模块添加到 `build.gradle` 中: ```gradle dependencies { implementation 'com.squareup.okhttp3:okhttp:4.10.0' // 核心OkHttp库 implementation 'com.squareup.okhttp3:okhttp-sse:4.10.0' // SSE支持库 } ``` 注意版本号需保持一致,并且建议始终选择最新稳定版。 --- ### 使用示例 以下是一个简单的例子,展示如何通过 `EventSource` 监听 SSE 数据流: ```java import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.sse.EventSource; import okhttp3.sse.EventSourceListener; public class SseExample { public static void main(String[] args) throws InterruptedException { OkHttpClient client = new OkHttpClient(); // 创建OkHttpClient实例 HttpUrl url = HttpUrl.parse("https://example.com/sse-endpoint").newBuilder().build(); EventSource eventSource = new EventSource.Builder(new EventSourceListener() { @Override public void onOpen(okhttp3.Response response) { System.out.println("连接已建立:" + response.message()); } @Override public void onClosed() { System.out.println("连接已关闭!"); } @Override public void onFailure(Throwable t, okhttp3.Response response) { t.printStackTrace(); } @Override public void onMessage(String id, String type, String data) { System.out.printf("[id=%s][type=%s] %s%n", id, type, data); } }, url).build(); eventSource.connect(); // 连接到SSE服务端点 Thread.sleep(60_000); // 示例运行时间设为60秒 eventSource.cancel(); // 关闭连接 } } ``` **说明:** - `onOpen`: 当客户端成功打开 SSE 流时触发回调。 - `onMessage`: 接收到新的消息时会调用此方法,包含数据、ID 和类型字段。 - `onFailure`: 如果发生错误则会被调用。 - `onClosed`: 客户端断开与服务器之间的链接后触发。 --- ### 注意事项 1. **权限声明**: 确保已在 Manifest 文件中加入网络访问权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 2. **线程管理**: 因为大多数安卓应用程序都需要异步加载内容而是阻塞主线程,在实际部署过程中应该考虑把上述逻辑放入单独的工作线程内执行。 3. **生命周期控制**: 需要小心地结合 Activity 或 Service 生命周期管理 `EventSource` 实例状态,防止内存泄漏等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值