前端向后端发送消息请求相应的接口就可以了。但是有些场景:比如聊天室互相发送消息或者进度条跟踪。如果仅靠前端主动发起通信获得消息的话就需要不断的轮询后端获得最新数据。这种方式会造成带宽等资源的浪费(因为请求http请求可能包含较长的请求头,而真正有用的可能只是其中的一小部分),而且还会增加后端的压力。如果后端能主动向前端推送消息就能很简单的解决这个问题。
使用 后端一种比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。
在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
WebSocket是一种在单个TCP连接上进行全双工通信的协议,WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket
API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 - 百度百科[WebSocket]
1:引入依赖
springboot集成了WebSocket模块,直接以下引入依赖即可:
org.springframework.boot spring-boot-starter-websocket
2:启用WebSocket
创建配置类启用WebSocket支持,用@Configuration和@Bean纳入spring
@Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
2:定义接口
@Component // ServerEndpoint就是一个url,和Controller的@RequestMapping差不多 @ServerEndpoint("/ws/test/{id}") public class WebSocketServer { // 定义成静态的一次注入大家就都能访问到了 private static TestResourceBean bean; @Resource public void setTestResourceBean(TestResourceBean bean) { WebSocketServer.bean = bean; } private Session session; private String id; public static Map前端socketServerMap = new ConcurrentHashMap<>(); @OnOpen public void onOpen(Session session, @PathParam("id") String id) { this.session = session; this.id = id; socketServerMap.put(id,this); } @OnClose public void onClose() { // 如果你用容器保存了实例,那么在关闭时记得移除,不然就内存溢出了 socketServerMap.remove(this.id); } @OnError public void onError(Session session, Throwable error) { } public Session getSession() { return this.session; } public void sendMessage(String message) { try { this.session.getBasicRemote().sendText(message); } catch (IOException e) { e.printStackTrace(); } } }
websocket使用
现在就能使用WebSocket进行前后端通信了。
参考资料:
SpringBoot2.0集成WebSocket,实现后台向前端推送信息