springboot 集成websocket

ppylox
·10/14/2021·0 阅读
AI 摘要模型根据正文自动生成,仅供参考

本文介绍Spring Boot集成WebSocket实现服务端主动推送。步骤:引入spring-boot-starter-websocket依赖;创建WebSocketConfig配置类注册ServerEndpointExporter;编写WebSocketServer,用@ServerEndpoint定义连接URI,通过@OnOpen、@OnClose、@OnMessage、@OnError处理连接生命周期,并用AtomicInteger统计在线数、Session发送消息;前端页面用WebSocket API建立连接并处理open、message、close、error回调。启动后访问页面,服务端每2秒推送一条消息。若出现Sec-WebSocket-Accept标头值错误,清除缓存重试。

websocket是javascript新增的一个特性,可以实现服务端主动推送消息到浏览器,通过一个长连接达到这个效果,而且还支持跨域。

1.引入依赖包


<dependency>\n  <groupId>org.springframework.boot</groupId>\n  <artifactId>spring-boot-starter-websocket</artifactId>\n</dependency>



2.创建配置文件WebSocketConfig.java

@Configuration\npublic class WebSocketConfig {\n\n@Bean\npublic ServerEndpointExporter serverEndpointExporter () {\n  return new ServerEndpointExporter();\n }\n}



3.创建服务器接口文件WebSocketServer.java:

/**\n* 前后端交互的类实现消息的接收推送(自己发送给自己)\n*\n* @ServerEndpoint(value = "/test/one") 前端通过此URI和后端交互,建立连接\n*/\n@Slf4j\n@ServerEndpoint(value = "/test/one")\n@Component\npublic class WebSocketServer {\n\n/**\n* 记录当前在线连接数\n*/\nprivate static AtomicInteger onlineCount = new AtomicInteger(0);\n\n/**\n* 连接建立成功调用的方法\n*/\n@OnOpen\npublic void onOpen(Session session) {\nonlineCount.incrementAndGet(); // 在线数加1\nlog.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get());\n}\n\n/**\n* 连接关闭调用的方法\n*/\n@OnClose\npublic void onClose(Session session) {\nonlineCount.decrementAndGet(); // 在线数减1\nlog.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get());\n}\n\n/**\n* 收到客户端消息后调用的方法\n*\n* @param message 客户端发送过来的消息\n*/\n@OnMessage\npublic void onMessage(String message, Session session) throws InterruptedException {\nlog.info("服务端收到客户端[{}]的消息:{}", session.getId(), message);\n\nfor (int i = 0; i < 10; i++){\nThread.sleep(2000);\nthis.sendMessage("Hello, " + message, session);\n}\n}\n\n@OnError\npublic void onError(Session session, Throwable error) {\nlog.error("发生错误");\nerror.printStackTrace();\n}\n\n/**\n* 服务端发送消息给客户端\n*/\nprivate void sendMessage(String message, Session toSession) {\ntry {\nlog.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message);\ntoSession.getBasicRemote().sendText(message);\n} catch (Exception e) {\nlog.error("服务端发送消息给客户端失败:{}", e);\n}\n}\n}


4.在static目录下创建前端请求页面index.html,

<!DOCTYPE HTML>\n<html>\n<head>\n<title>My WebSocket</title>\n</head>\n\n<body>\n<input id="text" type="text" />\n<button onclick="send()">Send</button>\n<button onclick="closeWebSocket()">Close</button>\n<div id="message"></div>\n</body>\n\n<script type="text/javascript">\nvar websocket = null;\n\n//判断当前浏览器是否支持WebSocket, 主要此处要更换为自己的地址\nif ('WebSocket' in window) {\nwebsocket = new WebSocket("ws://localhost:8089/test/one?test=1");\n} else {\nalert('Not support websocket')\n}\n\n//连接发生错误的回调方法\nwebsocket.onerror = function() {\nsetMessageInnerHTML("error");\n};\n\n//连接成功建立的回调方法\nwebsocket.onopen = function(event) {\nsetMessageInnerHTML("open");\n}\n\n//接收到消息的回调方法\nwebsocket.onmessage = function(event) {\nsetMessageInnerHTML(event.data);\n}\n\n//连接关闭的回调方法\nwebsocket.onclose = function() {\nsetMessageInnerHTML("close");\n}\n\n//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。\nwindow.onbeforeunload = function() {\nwebsocket.close();\n}\n\n//将消息显示在网页上\nfunction setMessageInnerHTML(innerHTML) {\ndocument.getElementById('message').innerHTML += innerHTML + '<br/>';\n}\n\n//关闭连接\nfunction closeWebSocket() {\nwebsocket.close();\n}\n\n//发送消息\nfunction send() {\nvar message = document.getElementById('text').value;\nwebsocket.send(message);\n}\n</script>\n</html>


最后启动应用访问:localhost:8091/index.html(端口为你自己定义的端口) 就能看到效果啦,每隔2秒浏览器会新增一条消息。


注意:如果请求的时候出现 Sec-WebSocket-Accept”标头值不正确,记得清一下缓存再试。



相关文章

评论 (0)

暂无评论,来写第一条吧