|
1 | 1 | # Server-Sent Events (SSE)
|
2 | 2 |
|
3 |
| -#### SSE 简介 |
| 3 | +## SSE 简介 |
4 | 4 |
|
5 | 5 | Server-Sent Events(SSE)是一种允许服务器主动向客户端发送信息的技术。与 WebSocket 不同,SSE 是单向通信,仅服务器能向客户端发送数据。这使得 SSE 非常适合于需要服务器实时推送数据但客户端不需要发送信息的场景,例如实时通知和更新。
|
6 | 6 |
|
7 |
| -#### tio-boot 中整合 SSE 的步骤 |
| 7 | +## tio-boot 中整合 SSE 的步骤 |
8 | 8 |
|
9 | 9 | 整合 SSE 到 tio-boot 框架中可以让你的应用具备实时数据推送的能力。以下是在 tio-boot 框架中创建一个简单的 SSE 应用的步骤和代码示例:
|
10 | 10 |
|
| 11 | +### Controller 发送 SSE 数据 |
| 12 | + |
11 | 13 | ##### 步骤 1: 创建 SSE Controller
|
12 | 14 |
|
13 | 15 | 首先,创建一个名为 `SseController` 的类,并用 `@RequestPath` 注解标记该类和方法。该方法将处理来自 `/sse` 路径的 SSE 请求。
|
@@ -71,24 +73,24 @@ curl http://localhost/sse
|
71 | 73 | 测试结果应该显示一系列格式化的 SSE 消息:
|
72 | 74 |
|
73 | 75 | ```
|
74 |
| -id:1 |
75 |
| -event:message |
76 |
| -data:This is message 0 |
| 76 | +id: 0 |
| 77 | +event: message |
| 78 | +data: This is message 0 |
77 | 79 |
|
78 |
| -id:2 |
79 |
| -event:message |
80 |
| -data:This is message 1 |
| 80 | +id: 1 |
| 81 | +event: message |
| 82 | +data: This is message 1 |
81 | 83 |
|
82 |
| -... |
| 84 | +id: 2 |
| 85 | +event: message |
| 86 | +data: This is message 2 |
83 | 87 | ```
|
84 | 88 |
|
85 | 89 | 每条消息都包含一个唯一的 `id`,事件类型 `event`,以及实际的消息内容 `data`。
|
86 | 90 |
|
87 | 91 | #### 完整的 Cotnroller
|
88 | 92 |
|
89 |
| -``` |
90 |
| -package com.litongjava.ai.chat.AController; |
91 |
| -
|
| 93 | +```java |
92 | 94 | import com.litongjava.tio.core.Tio;
|
93 | 95 | import com.litongjava.tio.http.common.HttpRequest;
|
94 | 96 | import com.litongjava.tio.http.common.HttpResponse;
|
@@ -136,6 +138,61 @@ public class SseController {
|
136 | 138 |
|
137 | 139 | ```
|
138 | 140 |
|
139 |
| -#### 总结 |
| 141 | +### Hanlder 发送 SSE 数据 |
| 142 | + |
| 143 | +```java |
| 144 | +import com.litongjava.tio.core.ChannelContext; |
| 145 | +import com.litongjava.tio.core.Tio; |
| 146 | +import com.litongjava.tio.http.common.HttpRequest; |
| 147 | +import com.litongjava.tio.http.common.HttpResponse; |
| 148 | +import com.litongjava.tio.http.server.sse.SsePacket; |
| 149 | + |
| 150 | +import lombok.extern.slf4j.Slf4j; |
| 151 | + |
| 152 | +@Slf4j |
| 153 | +public class MessageHander { |
| 154 | + |
| 155 | + public HttpResponse send(HttpRequest httpRequest) { |
| 156 | + |
| 157 | + ChannelContext channelContext = httpRequest.getChannelContext(); |
| 158 | + |
| 159 | + // 设置sse请求头 |
| 160 | + HttpResponse httpResponse = new HttpResponse(httpRequest).setServerSentEventsHeader(); |
| 161 | + |
| 162 | + // 发送http响应包,告诉客户端保持连接 |
| 163 | + Tio.send(channelContext, httpResponse); |
| 164 | + |
| 165 | + // 发送数据 |
| 166 | + sendData(channelContext); |
| 167 | + |
| 168 | + // 告诉处理器不要将消息发送给客户端 |
| 169 | + return new HttpResponse().setSend(false); |
| 170 | + } |
| 171 | + |
| 172 | + private void sendData(ChannelContext channelContext) { |
| 173 | + |
| 174 | + new Thread(() -> { |
| 175 | + for (int i = 0; i < 10; i++) { |
| 176 | + String eventName = "message"; |
| 177 | + String data = "This is message " + i; |
| 178 | + SsePacket ssePacket = new SsePacket().id(i).event(eventName).data(data.getBytes()); |
| 179 | + // 再次向客户端发送消息 |
| 180 | + Tio.send(channelContext, ssePacket); |
| 181 | + log.info("发送数据:{}", i); |
| 182 | + try { |
| 183 | + Thread.sleep(1000); |
| 184 | + } catch (InterruptedException e) { |
| 185 | + e.printStackTrace(); |
| 186 | + } |
| 187 | + } |
| 188 | + // 手动移除连接 |
| 189 | + Tio.remove(channelContext, "remove sse"); |
| 190 | + }).start(); |
| 191 | + } |
| 192 | +} |
| 193 | + |
| 194 | +``` |
| 195 | + |
| 196 | +### 总结 |
140 | 197 |
|
141 |
| -通过上述步骤,你可以在 tio-boot 框架中成功整合 SSE,从而使你的应用能够实时地向客户端推送数据。这种方法的优点在于其简单性和低延迟,非常适用于需要服务器实时更新的场景。 |
| 198 | +通过上述步骤,你可以在 tio-boot 框架中成功整合 SSE,从而使你的应用能够实时地向客户端推送数据。这种方法的优点在于其简单性和低延迟,非常适用于需要服务器实时更新的场景。 |
0 commit comments