springboot+websocket+sockjs进⾏消息推送【基于
STOMP协议】
1.浅谈WebSocket
WebSocket是在HTML5基础上单个TCP连接上进⾏全双⼯通讯的协议,只要浏览器和服务器进⾏⼀次握⼿,就可以建⽴⼀条快速通道,两者就可以实现数据互传了。说⽩了,就是打破了传统的http协议的⽆状态传输(只能浏览器请求,服务端响应),websocket全双⼯通讯,就是浏览器和服务器进⾏⼀次握⼿,浏览器可以随时给服务器发送信息,服务器也可以随时主动发送信息给浏览器了。对webSocket 原理有兴趣的客官,可以⾃⾏百度。
2.环境搭建
因为是根据项⽬的需求来的,所以这⾥我只介绍在SpringBoot下使⽤WebSocket的其中⼀种实现【STOMP协议】。因此整个⼯程涉及websocket使⽤的⼤致框架为SpringBoot+Maven+websocket,其他框架的基础搭建,我这⾥就不说了,相信各位也都很熟悉,我就直接集成websocket了。
在l加上对springBoot对WebSocket的⽀持:
<!-- webSocket -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
这样SpringBoot就和WebSocket集成好了,我们就可以直接使⽤SpringBoot提供对WebSocket操作的API了
3.编码实现
①在Spring上下⽂中添加对WebSocket的配置
import t.annotation.Configuration;
import fig.MessageBrokerRegistry;
import org.springframework.fig.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.fig.annotation.EnableWebSocketMessageBroker;
import org.springframework.fig.annotation.StompEndpointRegistry;
/**
* 配置WebSocket
*/
@Configuration
//注解开启使⽤STOMP协议来传输基于代理(message broker)的消息,这时控制器⽀持使⽤@MessageMapping,就像使⽤@RequestMapping⼀样
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{
@Override
//注册STOMP协议的节点(endpoint),并映射指定的url
public void registerStompEndpoints(StompEndpointRegistry registry) {
//注册⼀个STOMP的endpoint,并指定使⽤SockJS协议
registry.addEndpoint("/endpointOyzc").setAllowedOrigins("*").withSockJS();
}
@Override
//配置消息代理(Message Broker)
public void configureMessageBroker(MessageBrokerRegistry registry) {
//点对点应配置⼀个/user消息代理,⼴播式应配置⼀个/topic消息代理
//点对点使⽤的订阅前缀(客户端订阅路径上会体现出来),不设置的话,默认也是/user/
registry.setUserDestinationPrefix("/user");
}
}
介绍以上⼏个相关的注解和⽅法:
1.@EnableWebSocketMessageBroker:开启使⽤STOMP协议来传输基于代理(message broker)的消息,这时控制器⽀持使⽤
@MessageMapping,就像使⽤@RequestMapping⼀样。
2.AbstractWebSocketMessageBrokerConfigurer:继承WebSocket消息代理的类,配置相关信息。
4. ableSimpleBroker("/topic","/user"); 配置⼀个/topic⼴播消息代理和“/user”⼀对⼀消息代理
5. registry.setUserDestinationPrefix("/user");点对点使⽤的订阅前缀(客户端订阅路径上会体现出来),不设置的话,默认也是/user/
②实现服务器主动向客户端推送消息
SpringBoot封装得太好,webSocket⽤起来太简单(好处:⽤起来⽅便,坏处:你不知道底层实现)
由于代码中涉及到定时任务,这⾥我们使⽤,定时任务在配置类上添加@EnableScheduling开启对定时任务的⽀持(亦可以添加在主启动类上,作⽤是⼀样的),在相应的⽅法上添加@Scheduled声明需要执⾏的定时任务。不添加注解定时任务是⽆法⽣效的。感谢同学的指正。
1.⼀对多的实现:
先上后台java的代码
package com.cheng.sbjm.boot;
import org.springframework.beans.factory.annotation.Autowired;
import ssaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
import com.cheng.sbjm.domain.User;
@Controller
public class WebSocketController {
@Autowired
private SimpMessagingTemplate template;
//⼴播推送消息
@Scheduled(fixedRate = 10000)springboot框架的作用
public void sendTopicMessage() {
System.out.println("后台⼴播推送!");
User user=new User();
user.setUserName("oyzc");
user.setAge(10);
}
}
简单介绍⼀下
1.SimpMessagingTemplate:SpringBoot提供操作WebSocket的对象
2.@Scheduled(fixedRate = 10000):为了测试,定时10S执⾏这个⽅法,向客户端推送
3.1参数⼀:客户端监听指定通道时,设定的访问服务器的URL
3.2参数⼆:发送的消息(可以是对象、字符串等等)
在上客户端的代码(PC现代浏览器)
html页⾯:
<!DOCTYPE html>
<html>
<head>
<title>websocket.html</title>
<meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html" charset="UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<div>
<p id="response"></p>
</div>
<!-- 独⽴JS -->
<script type="text/javascript" src="jquery.min.js" charset="utf-8"></script> <script type="text/javascript" src="webSocket.js" charset="utf-8"></script> <script type="text/javascript" src="sockjs.min.js" charset="utf-8"></script> <script type="text/javascript" src="stomp.js" charset="utf-8"></script>
</body>
</html>
JS代码[webSocket.js]
var stompClient = null;
/
/加载完浏览器后调⽤connect(),打开双通道
$(function(){
//打开双通道
connect()
})
//强制关闭浏览器调⽤websocket.close(),进⾏正常关闭
disconnect()
}
function connect(){
var socket = new SockJS('127.0.0.1:9091/sbjm-cheng/endpointOyzc'); //连接SockJS的endpoint
名称为"endpointOyzc" stompClient = Stomp.over(socket);//使⽤STMOP⼦协议的WebSocket客户端
console.log('Connected:' + frame);
//通过stompClient.subscribe订阅/topic/getResponse ⽬标(destination)发送的消息
stompClient.subscribe('/topic/getResponse',function(response){
showResponse(JSON.parse(response.body));
});
});
}
//关闭双通道
function disconnect(){
if(stompClient != null) {
stompClient.disconnect();
}
console.log("Disconnected");
}
function showResponse(message){
var response = $("#response");
response.append("<p>"+message.userName+"</p>");
}
值得注意的是,只需要在连接服务器注册端点endPoint时,写访问服务器的全路径URL:
new SockJS('127.0.0.1:9091/sbjm-cheng/endpointOyzc');
其他监听指定服务器⼴播的URL不需要写全路径
stompClient.subscribe('/topic/getResponse',function(response){
showResponse(JSON.parse(response.body));
});
2.⼀对⼀的实现
先上后台java的代码
package com.cheng.sbjm.boot;
import org.springframework.beans.factory.annotation.Autowired;
import ssaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
import com.cheng.sbjm.domain.User;
@Controller
public class WebSocketController {
@Autowired
private SimpMessagingTemplate template;
//⼀对⼀推送消息
@Scheduled(fixedRate = 10000)
public void sendQueueMessage() {
System.out.println("后台⼀对⼀推送!");
User user=new User();
user.setUserId(1);
user.setUserName("oyzc");
user.setAge(10);
}
}
简单介绍⼀下:
1.SimpMessagingTemplate:SpringBoot提供操作WebSocket的对象
2.@Scheduled(fixedRate = 10000):为了测试,定时10S执⾏这个⽅法,向客户端推送
3.1参数⼀:指定客户端接收的⽤户标识(⼀般⽤⽤户ID)
3.2参数⼆:客户端监听指定通道时,设定的访问服务器的URL(客户端访问URL跟⼴播有些许不同)
3.3参数三:向⽬标发送消息体(实体、字符串等等)
在上客户端的代码(PC现代浏览器)
html页⾯:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论