HTML服务器发送事件(ServerSent Events,简称SSE)是一种允许服务器向客户端推送实时更新的技术,这种技术在Web应用中非常有用,例如实时聊天、股票行情、新闻推送等场景,在Spring MVC中,我们可以使用SseEmitter
类来实现服务器发送事件。
本文将详细介绍如何在Spring MVC中使用HTML服务器发送事件,我们需要创建一个Spring MVC项目,并添加相关依赖,我们将编写一个简单的控制器来处理客户端的请求,并使用SseEmitter
向客户端发送实时更新,我们将编写一个简单的HTML页面来接收服务器发送的事件。
1、创建Spring MVC项目
我们首先需要创建一个Spring MVC项目,可以使用Eclipse、IntelliJ IDEA等IDE创建一个Maven或Gradle项目,在项目的pom.xml文件中,添加以下依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>springbootstarterweb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>springbootstarterwebsocket</artifactId> </dependency> </dependencies>
2、编写控制器
接下来,我们编写一个名为EventController
的控制器类,用于处理客户端的请求,在这个类中,我们将使用SseEmitter
向客户端发送实时更新。
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @RestController public class EventController { private final ExecutorService nonBlockingService = Executors.newCachedThreadPool(); private SseEmitter emitter = new SseEmitter(); @GetMapping("/events") public SseEmitter getEvents() throws IOException { System.out.println("Client connected"); emitter = new SseEmitter(); nonBlockingService.execute(() > { try { for (int i = 0; i < 10; i++) { TimeUnit.SECONDS.sleep(1); emitter.send("Event " + i); } } catch (IOException | InterruptedException e) { emitter.completeWithError(e); } finally { try { emitter.complete(); } catch (IOException e) { emitter.completeWithError(e); } } }); return emitter; } }
在上面的代码中,我们首先创建了一个名为EventController
的控制器类,并使用@RestController
注解标记它,我们定义了一个名为getEvents
的方法,该方法使用@GetMapping("/events")
注解映射到客户端的请求,在这个方法中,我们创建了一个SseEmitter
对象,并使用一个非阻塞线程池来执行定时任务,每隔1秒,我们就向客户端发送一个事件,事件的内容为"Event "加上当前的计数值,当所有事件都发送完毕后,我们调用emitter.complete()
方法关闭连接,如果在发送过程中发生异常,我们调用emitter.completeWithError()
方法将异常传递给客户端。
3、编写HTML页面
我们编写一个简单的HTML页面来接收服务器发送的事件,在这个页面中,我们使用JavaScript的EventSource
对象来监听服务器发送的事件,当收到事件时,我们将事件内容显示在一个名为eventOutput
的<div>
元素中。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF8"> <title>ServerSent Events Example</title> <script src="https://code.jquery.com/jquery3.6.0.min.js"></script> </head> <body> <h1>ServerSent Events Example</h1> <div id="eventOutput"></div> <script> var source = new EventSource("/events"); source.onmessage = function (event) { $("#eventOutput").append("<p>" + event.data + "</p>"); }; source.onerror = function (error) { console.error("Error occurred:", error); }; </script> </body> </html>
在上面的代码中,我们首先引入了jQuery库和EventSource对象,我们创建了一个名为source
的EventSource对象,并将其连接到服务器的"/events"端点,当收到服务器发送的事件时,我们将事件内容添加到名为eventOutput
的<div>
元素中,如果在连接过程中发生错误,我们将错误信息输出到控制台。
最新评论
本站CDN与莫名CDN同款、亚太CDN、速度还不错,值得推荐。
感谢推荐我们公司产品、有什么活动会第一时间公布!
我在用这类站群服务器、还可以. 用很多年了。