SSE介绍
SSE适用场景的特点可以概况为以下几点:
● 单向通信:服务器只要向客户端推送数据,而不需要接收客户端的数据。
● 实时数据更新:服务器可以不断地将最新的数据推送给客户端,保持数据的实时性和准确性。
● 低延迟:服务器需要尽快地将数据推送给客户端,避免数据的延迟和过期。
SSE实践
我们可以使用各种编程语言和技术栈来实现SSE。
通过服务端,实现数据推送;在客户端,实现服务器端推送数据的接收。
#服务端
pip install sse-starlette
下面是具体示例:
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from sse_starlette import EventSourceResponse
import asyncio
import uvicorn
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
async def answer_generator(request: Request):
answer = 'SSE是一种基于HTTP协议的服务器主动向客户端推送数据的技术,利用HTTP的长连接特性,在客户端与服务器之间建立长连接。'
for i in answer:
if await request.is_disconnected():
print("连接已中断")
break
yield{
'id':'100001',
'event': 'message',
'retry': 15000,
'data': i
}
await asyncio.sleep(0.2)
async def chat(request: Request):
response = answer_generator(request)
return EventSourceResponse(response)
if __name__ == "__main__":
uvicorn.run(app, host='0.0.0.0', port=8080)
#客户端
EventSource说明:https://developer.mozilla.org/zh-CN/docs/Web/API/EventSource
EventSource 可以监听三种类型的事件:message、open 和 error。
message 事件:当接收到服务器发送的消息时触发。 open 事件:当连接被打开时触发。 error 事件:当发生连接错误时触发。
如果使用POST请求,常用借助第三方库fetchEventSource方法连接服务。
npm install @microsoft/fetch-event-source
<html>
<head>
<title>SSE Client</title>
</head>
<body>
<h1>SSE Messages</h1>
<h3 id="messages"></h3>
<script>
// 创建一个新的EventSource对象来连接到SSE服务器
var source = new EventSource('http://127.0.0.1:8080/chat');
// 当接收到消息时,将其添加到页面上
source.onmessage = function(event) {
var data = event.data;
var messages = document.getElementById('messages');
messages.innerHTML += data;
};
// 可选:处理连接打开事件
source.onopen = function(event) {
console.log('SSE connection opened.');
};
// 可选:处理连接错误事件
source.onerror = function(event) {
console.error('SSE error:', event);
source.close(); // 关闭连接
};
</script>
</body>
</html>
结合大模型通用知识及在交通、社会治理、安全生产、自然资源等行业领域的知识,深入业务场景,精确捕获用户意图,为用户提供智能问答、数据分析、报表生成、工作任务理解与执行等一系列服务
📞若您有相关需求,欢迎点击下方链接与我们沟通洽谈
🗨️也可以在公众号后台给我们留言