平台奖励创作,可能会升级VIP文章,可以移步我的公众号:【编程朝花夕拾】,且可获取首发内容。
01 引言
SSE是一种用于实现服务器向客户端实时单向推送数据的Web技术。基于HTTP协议,允许服务器将数据以事件流(Event Stream)的形式发送给客户端。客户端通过建立持久的HTTP连接,并监听事件流,可以实时接收服务器推送的数据。
因为是Web技术,且通过Http协议的建立连接。所以它的适用性更强,基础的网络环境都可支持。本文采用SSE技术代替WebSocket,看看实现的效果。
至于SSE的详细介绍,我之前写过一篇文章,可以参考:
https://blog.csdn.net/static_coder/article/details/133347359
02 Maven依赖的引入
由于SSE是Web技术,所以只需要引入Web即可,无需第三方依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
03 SSE的最佳实践
SSE不需要额外的配置,就像正常的Http请求一样丝滑。
3.1 SSE建立连接
public static final ConcurrentHashMap<String, SseEmitter> SSE_MAP = new ConcurrentHashMap<>();
@GetMapping("/connect")
public SseEmitter sseEmitter() throws IOException {
log.info("SSE连接建立成功......");
SseEmitter emitter = new SseEmitter(0L);
// 链接建立完成之后,需要发送消息给客户端
String sseEmitterId = UUID.randomUUID().toString();
SSE_MAP.put(sseEmitterId, emitter);
// 发送消息,发送客户端的唯一标识会给客户端
Map<String, Object> msgMap = new HashMap<>();
msgMap.put("clientId", sseEmitterId);
emitter.send(SseEmitter.event().data(JSON.toJSONString(msgMap)));
// 发送进入直播间的消息
noticeClient(sseEmitterId, sseEmitterId.substring(0, 5) + "*** 进入了直播间");
emitter.onCompletion(() -> {
log.info("SSE操作完毕,连接关闭");
SSE_MAP.remove(sseEmitterId);
// 发送离开直播间的消息
noticeClient(sseEmitterId, sseEmitterId.