一.什么是WebSocket
WebSocket为浏览器和服务端提供了双工异步通信的功能,即浏览器可以向服务端发送消息,服务端也可以向浏览器发送消息。WebSocket需要浏览器支持,如IE10+,Chrome 13+,Firefox 6+.
WebSocket是通过一个socket来实现双工异步通信的。但是直接使用WebSocket(或者SockJS:WebSocket协议的模拟,增加了当浏览器不支持WebSocket的时候的兼容支持)协议开发程序显得特别繁琐,我们使用它的子协议STOMP,更高级的协议,STOMP协议使用一个基于帧(frame)的格式来定义消息。
Spring boot对 内嵌的Tomcat,Jetty和Undertow使用了WebSocket提供了支持.
spring boot为WebSocket提供的stater pom是spring-boot-starter-websocket
二.实战
1.准备,新建spring boot项目,选择Thymeleaf和Websocket依赖
2.广播式
广播式即服务端有消息时,会将消息发送给所有连接了当前endpoint的浏览器。
(1)配置WebSocket,代码如下:
package com.zl.demo;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
/**
* 广播式:服务端有消息时,会将消息发送给当前endpoint的浏览器
* (1)配置websocket 需要在配置类上使用@EnableWebSocketMessageBroker,开启支持
* ,并通过继承AbstractWebSocketMessageBrokerConfigurer,重写其方法来配置webSocket
* @author zhangliang
*
*/
@Configuration
@EnableWebSocketMessageBroker //开启使用stomp协议来传输消息
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) { //注册stomp协议节点,映射指定的url
registry.addEndpoint("endpointZL").withSockJS(); //注册一个STOMP的endpoint,并指定SockJS协议
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {//配置消息代理
registry. enableSimpleBroker("/topic"); //广播式应配置一个/topic消息代理
}
}
(2)浏览器向服务端发送的消息用此类接受:
package com.zl.demo.domain;
/**
* 浏览器向服务端发送消息用此类接受
* @author zhangliang
*
*/
public class ZLMessgae {
private String name;
public String getName() {
return name;
}
}
(3)服务端向浏览器发送的此类的消息
package com.zl.demo.domain;
/**
* 服务端向浏览器发送此类消息
*
* @author zhangliang
*
*/
public class ZLResponse {
private String responseMessage;
public ZLResponse(String responseMessage) {
super();
this.responseMessage = responseMessage;
}
public String getResponseMessage() {
return responseMessage;
}
}
(4)控制器
package com.zl.demo.controller;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import com.zl.demo.domain.ZLMessgae;
import com.zl.demo.domain.ZLResponse;
/**
* 控制器
* @author zhangliang
*
*/
@Controller
public class WsController {
@MessageMapping("/welcome") //映射
@SendTo("/topic/getResponse") //当服务器有消息会向订阅@SendTo路径的浏览器发送消息
public ZLResponse say(ZLMessgae messgae) throws Exception {
Thread.sleep(3000);
return new ZLResponse("Welcome,"+messgae.getName()+"!");
}
}
(5)添加js脚本stomp.min.js,sockjs.main.js,jquery.min.js,在下面地址可以找到最新版本
http://www.bootcdn.cn/stomp.js/
http://www.bootcdn.cn/sockjs-client/
http://www.bootcdn.cn/jquery/
(6)演示页面,在src/main/resources/templates下新建ws.html
地址:https://blog.csdn.net/u013205151/article/details/80699097
(7)配置viewController
package com.zl.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@SpringBootApplication
public class SpringBootDemoApplication extends WebMvcConfigurerAdapter{
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/ws").setViewName("ws");
}
}
(8)运行,多开几个窗口,访问http://localhost:8080/ws,然后分别连接上服务器,然后一个浏览器发送消息,其他浏览器都能接受。正常。