Android 使用sse实现长连接的效果

import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.internal.sse.RealEventSource
import okhttp3.sse.EventSourceListener
import java.util.concurrent.TimeUnit

class SseManager {
    private var httpClient: OkHttpClient
    private var eventSource: RealEventSource? = null

    init {
        httpClient = OkHttpClient()
    }

    fun startListening(url: String, listener: EventSourceListener) {
        val request: Request = Request.Builder()
            .url(url)
            .build()
        httpClient = OkHttpClient.Builder()
            .connectTimeout(1, TimeUnit.DAYS)
            .readTimeout(1, TimeUnit.DAYS) //这边需要将超时显示设置长一点,不然刚连上就断开,之前以为调用方式错误被坑了半天
            .build()

        eventSource = RealEventSource(request, listener)
        eventSource?.connect(httpClient)
    }

    fun stopListening() {
        eventSource?.cancel()
    }
}
import com.hanweb.android.complat.JLog
import okhttp3.Response
import okhttp3.sse
### 实现 UniApp 中的 SSE 流式输出 在 UniApp 开发环境中实现服务器发送事件(SSE)流式输出面临一定挑战,因为传统上微信小程序环境并不完全支持原生的 SSE 协议。然而,随着技术的发展以及 API 的更新,现在可以通过特定配置达到类似的效果。 对于 UniApp 来说,在尝试利用 SSE 进行流式通信时遇到的主要问题是兼容性和跨平台的支持[^3]。为了克服这些障碍并成功实现在 UniApp 应用程序内的流式数据接收功能,建议采用如下方法: #### 使用 `wx.request` 方法配合分块传输 尽管直接使用标准的 JavaScript EventSource 对象可能无法正常工作于某些平台上,但可以借助 WeChat Mini Program 提供的 `wx.request()` 函数及其新特性——启用分块模式 (`enableChunked`) 来模拟 SSE 行为。 下面是一个简单的例子展示了如何设置请求以监听来自服务器端的消息片段,并实时显示给用户: ```javascript // 创建一个 HTTP 请求任务实例 const requestTask = wx.request({ url: 'https://example.com/stream', // 替换成实际的服务端 URL method: 'GET', header: { 'content-type': 'text/event-stream' // 设置 MIME 类型为 event stream }, enableChunked: true // 启动分块传输选项 }); // 当接收到新的数据包时触发此回调函数 requestTask.onChunkReceived((res) => { let decoder; try { // 解码二进制数据至字符串形式 ({ TextDecoder } = require('text-encoding')); decoder = new TextDecoder(); const textMessage = decoder.decode(res.data); console.log(`接收到的数据:${textMessage}`); // 更新 UI 或者处理接收到的信息... } catch (error) { console.error("解码失败", error); } }); ``` 这段代码实现了与服务端建立持续连接的功能,每当有新的消息传入就会立即被解析出来并通过控制台打印或进一步用于界面渲染。需要注意的是,这里假设服务器返回的内容是以 UTF-8 编码的文字信息;如果是其他格式,则需调整相应的编码方式。 #### 处理不同平台间的差异 考虑到 UniApp 是一个多端框架,意味着同样的源码可能会部署到多个目标平台之上(如 H5、iOS 和 Android)。因此,在编写上述逻辑的同时也要注意针对各个具体运行环境做出适当优化和适配措施,确保最佳用户体验[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值