Android 接收 text/event-stream 数据

结合了 okhttp 进行网络请求

val inputStream = response.body?.byteStream()
val reader = BufferedReader(InputStreamReader(inputStream))
var str: String?
while (true) {
    str = reader.readLine()
    if (str != null && str.isNotEmpty()) {
        when{
         str.startsWith("event:")->{
            //处理数据
         }
         str.startsWith("data:")->{
            val jsonStr = str.substring(5).trim()
            if (jsonStr.equals("[DONE]")) {
                //结束处理                            
                break
            }
            //处理数据
         }
        }
    }
}

和 Flow 结合
https://medium.com/@manoel.al.amaro/understand-kotlin-flow-coroutines-by-implementing-server-side-sent-sse-9e190ff5f24f

后端使用Server-Sent Events (SSE) 进行流式输出是一种技术,它允许服务器持续推送更新给客户端,而无需客户端频繁发起请求。在Android前端,你可以通过JavaScript库如`socket.io-client`或原生的`WebSocket` API来实现实时接收这些数据。 以下是基本步骤: 1. **后端设置**:后端创建一个支持SSE的服务器,当有新数据可用时,使用HTTP响应头`Content-Type: text/event-stream`发送事件流。 ```javascript const express = require('express'); const app = express(); app.get('/stream', (req, res) => { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.setHeader('Connection', 'keep-alive'); setInterval(() => { res.write(`data: ${new Date().toLocaleTimeString()} - New data arrived\n\n`); }, 1000); // 每秒发送一次数据 }); ``` 2. **前端订阅**:在Android应用的前端,你需要建立一个长轮询或者WebSocket连接,并监听新的数据事件。 ```javascript let socket = io('http://your-backend-url/stream'); socket.on('data', (message) => { // 将接收到的消息添加到页面 document.getElementById('typing-effect').innerText += message.replace('\n', '<br>'); }); ``` 这里假设有一个DOM元素id为`typing-effect`用于显示数据。 3. **视觉模拟**:为了实现打字机效果,可以在每次接收数据时动态添加字符,或者使用定时函数让文本逐渐显现,给人一种正在打字的感觉。 ```javascript setInterval(() => { const char = message.charAt(message.length - 1); if (char) { document.getElementById('typing-effect').innerHTML += char; } else { clearInterval(intervalId); } }, 100); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值