SpringBoot 使用WebSocket

来源:互联网 发布:windows insider 编辑:程序博客网 时间:2024/06/15 04:12

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。
WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范。

使用WebSocket避免了以往的通过setInterval定时任务来获取服务状态的弊端(有时会存在无效请求或者状态丢失),客户端可以及时获取到服务器状态并做处理或者展现,SpringBoot中使用起来也相对简单
引入依赖

 <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-websocket</artifactId>        </dependency>        <dependency>            <groupId>org.webjars</groupId>            <artifactId>webjars-locator</artifactId>        </dependency>        <dependency>            <groupId>org.webjars</groupId>            <artifactId>sockjs-client</artifactId>            <version>1.0.2</version>        </dependency>        <dependency>            <groupId>org.webjars</groupId>            <artifactId>stomp-websocket</artifactId>            <version>2.3.3</version>        </dependency>        <dependency>            <groupId>org.webjars</groupId>            <artifactId>bootstrap</artifactId>            <version>3.3.7</version>        </dependency>        <dependency>            <groupId>org.webjars</groupId>            <artifactId>jquery</artifactId>            <version>3.1.0</version>        </dependency>

页面中引入需要的JavaScript

<script src="/webjars/sockjs-client/sockjs.min.js"></script><script src="/webjars/stomp-websocket/stomp.min.js"></script>

首先客户端进行注册订阅

var stompClient = null;function connect() {    var socket = new SockJS('/ypmc_websocket');    stompClient = Stomp.over(socket);    stompClient.connect({}, function (frame) {        console.log('Connected: ' + frame);        stompClient.subscribe('/ypmc/message', function (greeting) {            var response = JSON.parse(greeting.body);        });    });}

WebSocket配置初始化

@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {    @Override    public void configureMessageBroker(MessageBrokerRegistry config) {        config.enableSimpleBroker("/ypmc");        config.setApplicationDestinationPrefixes("/app");    }    @Override    public void registerStompEndpoints(StompEndpointRegistry registry) {        registry.addEndpoint("/ypmc_websocket").withSockJS();    }}

当客户端和服务器建立连接之后,他们之间就可以相互进行通信了,首先,第一种场景:

客户端主动发起请求

function sendName() {    stompClient.send("/app/hello", {}, JSON.stringify({'requestMessage': 'hello server'}));}

服务端接收并返回给客户端

@Controllerpublic class WebSocketController {    @MessageMapping("/hello")    @SendTo("/ypmc/message")    public ResponseMessage getMessage(RequestMessage requestMessage) throws Exception {        return ResponseMessage.builder().message("hello " + requestMessage).build();    }}

第二种场景

服务器主动向客户端推送消息

@Autowiredprivate SimpMessagingTemplate messagingTemplate;messagingTemplate.convertAndSend("/ypmc/message", responseMessage);