springboot集成WebSockets广播消息(推荐)
一WebScoketS简介
RFC6455即webSockets协议提供了一种标准化的方式去建立全双工,双方面交流的通道在客户端和服务端甚至单一的TCP连接中进行通信;webSockets协议其跟HTTP的tcp协议不同,但是其设计目的是通过HTTP协议进行工作,可以使用40或者443端口和重新使用现有的防火墙规则;
GET/spring-websocket-portfolio/portfolioHTTP/1.1 Host:localhost:8080 Upgrade:websocket Connection:Upgrade Sec-WebSocket-Key:Uc9l9TMkWGbHFD2qnFHltg== Sec-WebSocket-Protocol:v10.stomp,v11.stomp Sec-WebSocket-Version:13 Origin:http://localhost:8080
webSockets的交互是以HTTP协议开始的,使用Upgradeheader转向使用Upgrade连接;如果非200状态成功响应就类似于下面的信息;如果WebSocketserver是运行在nginx是需要配置WebSocketupgraderequests;如果是运行在云上,需要查阅相关的云是否支持WebSocket;
HTTP/1.1101SwitchingProtocols Upgrade:websocket Connection:Upgrade Sec-WebSocket-Accept:1qVdfYHU9hPOl4JYYNXF623Gzn0= Sec-WebSocket-Protocol:v10.stomp
二HTTP和WebSocket对比
在HTTP和REST中一个应用需要很多的URLs;应用和客户端是通过请求和响应的风格使用这些URLs进行交互;服务端会路由这些请求给基于HTTP的URL或者方法或者头进行处理;
WebSockets通常在初始化的时候就只有一个链接,所有应用的消息都是通过相同的TCP连接进行流动;这指向一个完全不同的异步、事件驱动的消息传递体系结构。
WebSocket是一种低端的协议,不像HTTP,其不规定消息中内容中任何的语义信息;这意味着其没有任何方式去路由或者处理这些信息,除非客户端和服务端在语义上达成一致;
WebSocket客户端和服务端其交流是通过使用更加高级的消息协议(比如STOMP)和基于HTTP握手请求的Sec-WebSocket-Protocolheader;
三注意事项
WebSockets可以使web页面具有动态性和交互性。然而,在许多情况下,Ajax和HTTP流或longpolling(轮询)可以提供一个简单有效的解决方案。HTTP流和polling适用于消息不频繁的交互,WebSockets适用于消息较频繁的交互;在因特网上由于没有Upgradeheader或者关闭了空闲的长链接,受限于在你有限的代理可能会将WebSockets的交互排除;
四websocket配置和依赖
4.1依赖
org.springframework.boot spring-boot-starter-parent 2.1.1.RELEASE org.springframework.boot spring-boot-starter-websocket org.springframework.boot spring-boot-starter-thymeleaf
4.2配置
/** *@Authorlsc *@Descriptionwebsocket配置类
*@Date2019/11/1222:27 */ //使用STOMP协议来传输基于消息代理的消息,控制器支持在@Controller类中使用@MessageMapping @EnableWebSocketMessageBroker @Configurable @EnableWebSocket @Component publicclassWebConfigimplementsWebSocketMessageBrokerConfigurer{ @Override publicvoidregisterStompEndpoints(StompEndpointRegistryregistry){ //注册Stomp的端点(Endpoint),并且映射指定的url registry.addEndpoint("/websocket") .setAllowedOrigins("*")//添加允许跨域访问 .withSockJS();//指定SockJS协议 } @Override publicvoidconfigureMessageBroker(MessageBrokerRegistryregistry){ //启动广播模式代理,只有符合的的路径才发送消息 registry.enableSimpleBroker("/topic"); } }
五实体类
5.1接受消息实体
/** *@Authorlsc *@Description接受客户端消息
*@Date2019/11/1222:42 */ publicclassAcceptMessages{ privateStringname; publicStringgetName(){ returnname; } }
5.2发送消息实体
/** *@Authorlsc *@Description发送消息给客户端
*@Date2019/11/1222:42 */ publicclassSendMessages{ privateStringresponseMessage; publicStringgetResponseMessage(){ returnresponseMessage; } publicvoidsetResponseMessage(StringresponseMessage){ this.responseMessage=responseMessage; } }
六控制器
/** *@Authorlsc *@Descriptionwebsockets之广播式
*@Date2019/11/1222:49 */ @Controller publicclassWebSocketsController{ @MessageMapping("/welcome")//类似@RequestMapping,进行客户端请求地址映射 @SendTo("/topic/getResponse")//订阅了@SendTo中的路径进行发送消息 publicSendMessagesbroadcast(AcceptMessagesacceptMessages){ System.out.println(acceptMessages.getName()); SendMessagessendMessages=newSendMessages(); sendMessages.setResponseMessage("知识追寻者:"+acceptMessages.getName()); returnsendMessages; } }
七前端页面
在resource目录下新建templates目录存放WebSockets.html;在resource目录下新建static目录,继续在其子目录下新建js目录存放sockjs.min.js,stomp.min.js,jquery-3.3.1.min.js;
springboot广播式WebSocket 连接 断开连接 发送