Skip to content

Commit 6731ed2

Browse files
author
litongjava
committed
add send sse to client in hanlder
1 parent b8e705f commit 6731ed2

File tree

1 file changed

+71
-14
lines changed
  • docs/zh/06_内置组件

1 file changed

+71
-14
lines changed

docs/zh/06_内置组件/02.md

+71-14
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
# Server-Sent Events (SSE)
22

3-
#### SSE 简介
3+
## SSE 简介
44

55
Server-Sent Events(SSE)是一种允许服务器主动向客户端发送信息的技术。与 WebSocket 不同,SSE 是单向通信,仅服务器能向客户端发送数据。这使得 SSE 非常适合于需要服务器实时推送数据但客户端不需要发送信息的场景,例如实时通知和更新。
66

7-
#### tio-boot 中整合 SSE 的步骤
7+
## tio-boot 中整合 SSE 的步骤
88

99
整合 SSE 到 tio-boot 框架中可以让你的应用具备实时数据推送的能力。以下是在 tio-boot 框架中创建一个简单的 SSE 应用的步骤和代码示例:
1010

11+
### Controller 发送 SSE 数据
12+
1113
##### 步骤 1: 创建 SSE Controller
1214

1315
首先,创建一个名为 `SseController` 的类,并用 `@RequestPath` 注解标记该类和方法。该方法将处理来自 `/sse` 路径的 SSE 请求。
@@ -71,24 +73,24 @@ curl http://localhost/sse
7173
测试结果应该显示一系列格式化的 SSE 消息:
7274

7375
```
74-
id:1
75-
event:message
76-
data:This is message 0
76+
id: 0
77+
event: message
78+
data: This is message 0
7779
78-
id:2
79-
event:message
80-
data:This is message 1
80+
id: 1
81+
event: message
82+
data: This is message 1
8183
82-
...
84+
id: 2
85+
event: message
86+
data: This is message 2
8387
```
8488

8589
每条消息都包含一个唯一的 `id`,事件类型 `event`,以及实际的消息内容 `data`
8690

8791
#### 完整的 Cotnroller
8892

89-
```
90-
package com.litongjava.ai.chat.AController;
91-
93+
```java
9294
import com.litongjava.tio.core.Tio;
9395
import com.litongjava.tio.http.common.HttpRequest;
9496
import com.litongjava.tio.http.common.HttpResponse;
@@ -136,6 +138,61 @@ public class SseController {
136138

137139
```
138140

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+
### 总结
140197

141-
通过上述步骤,你可以在 tio-boot 框架中成功整合 SSE,从而使你的应用能够实时地向客户端推送数据。这种方法的优点在于其简单性和低延迟,非常适用于需要服务器实时更新的场景。
198+
通过上述步骤,你可以在 tio-boot 框架中成功整合 SSE,从而使你的应用能够实时地向客户端推送数据。这种方法的优点在于其简单性和低延迟,非常适用于需要服务器实时更新的场景。

0 commit comments

Comments
 (0)