–在以往我们前后端通讯常常通过http接口来哀求访问,当后端数据发生改变后,前端页面是无法感知的,只能通过不断地轮训哀求后端接口,后端接口再去查询数据库从而返回给前端,这种方法固然简单,但是非常斲丧资源,毕竟每次哀求都是需要经过三次tcp的,所以我们可以采取另一种方法,采用WebSocket的模式,前后端创建一个长连接,只要后端业务发生改变,立刻想前端自动发送消息,来实现前端无感知刷新数据,接下来就讲解一下具体步骤!
第一步、创建一个后端WebSocket服务端
- /**
- * websocket
- * @author wfeil211@foxmail.com
- */
- @Component // 交给IOC容器
- @ServerEndpoint("/webSocket") // 这里的路径即前端连接的路径
- public class WebSocketService {
- // 定义属性
- private Session session;
- //创建一个set用来存储用户
- private static CopyOnWriteArraySet<WebSocketService> websockets = new CopyOnWriteArraySet<>();
- /**
- * 当有用户创建连接时候调用该方法
- */
- @OnOpen
- public void onOpen(Session session) {
- // 给当前的Session赋值
- this.session = session;
- // 将当前对象添加到CopyOnWriteArraySet 中
- websockets.add(this);
- // 可以获取该session,但是其实也是一个内存地址
- System.err.println("【建立连接】 用户为:" + this.session);
- // 获取总数,这个不难理解,实际上这个集合的总数,就是WebSocket连接的总数
- System.err.println("【建立连接】 总数为:" + websockets.size());
- }
- /**
- * 有用户连接断开时候触发该方法
- */
- @OnClose
- public void onClose() {
- websockets.remove(this); // 将当前的对象从集合中删除
- System.err.println("【连接断开】 用户为:" + this.session);
- System.err.println("【连接断开】 总数为:" + websockets.size());
- }
- /**
- * 这个方法是客户端给服务端发送消息触发该方法
- * @param message : 消息内容
- */
- @OnMessage
- public void onMessage(String message) {
- System.err.println("【收到客户端发的消息】:" + message);
- }
- /**
- * 发送消息的方法,方便后期别的service调用
- *
- * @param message 消息内容
- */
- public void sendMessage(String message) {
- for (WebSocketService websocket : websockets) { // 遍历该Set集合
- System.err.println("广播消息 【给用户】 :" + websocket + "发送消息" + "【" + message + "】"); // 获取一个,在控制台打印一句话
- try {
- websocket.session.getBasicRemote().sendText(message); // 发送消息的方法
- } catch (IOException e) {
- e.getMessage();
- }
- }
- }
- }
复制代码 第二步、编写前端JavaScript代码
- let webSocket = null; // 创建一个变量
- if ('WebSocket' in window){ // 判断当前的浏览器是否支持WebSocket
- // 如果支持则创建一个WebSocket赋值给刚才创建的变量
- // 后面的路径实际上就是一次请求,但是这里用的是WebSocket协议
- let host = window.location.protocol+"//"+window.location.host+"/";
- let serverip = host.replace('https','wss').replace('http','ws');
- webSocket = new WebSocket(serverip + 'webSocket');
- }else{ // 如果不兼容则弹框,该浏览器不支持
- alert('该浏览器不支持')
- }
- /**
- * 当WebSocket创建连接(初始化)会触发该方法
- */
- webSocket.onopen = function (event){
- console.log('建立连接') // 这个代表在浏览器打印日志,跟Java的System.out.println()意思一致
- }
- /**
- * 当WebSocket关闭时候会触发该方法
- */
- webSocket.onclose = function (event){
- console.log('关闭连接') // 同上
- }
- /**
- * 当WebSocket接受消息会触发该方法
- */
- webSocket.onmessage = function (event){
- console.log('收到消息:'+event.data)
- let parse = JSON.parse(event.data);
- // 处理我们的业务
- }
- /**
- * 当WebSocket连接出错触发该方法
- */
- webSocket.onerror = function (event){
- console.log('websocket发生错误',event);
- }
- /**
- * 页面关闭,WebSocket关闭
- */
- window.onbeforeunload = function (){
- webSocket.close();
- }
复制代码 第三步、编写Vue代码
- methods: {
- /**
- * 初始化webSocket连接
- * */
- initWebSocket() {
- if (typeof WebSocket === "undefined") {
- alert("您的浏览器不支持socket");
- } else {
- // 实例化socket
- let host = window.location.protocol+"//"+window.location.host+"/";
- let serverip = host.replace('https','wss').replace('http','ws');
- this.socket = new WebSocket(serverip + 'webSocket');
- // 监听socket连接
- this.socket.onopen = function (evt) {
- //alert('连接服务组件成功!');
- console.log("连接成功!");
- };
- // 监听socket错误信息
- this.socket.onerror = function (evt) {
- console.log("ERROR: " + evt.data);
- };
- // 监听socket消息
- this.socket.onmessage = this.getMessage;
- }
- },
- /**
- * 输入日志
- * */
- getMessage: function (msg) {
- let obj = JSON.parse(msg.data);
- console.log("收到消息:", obj);
- // 做我们的业务
- }
- },
- /**
- * 挂载
- */
- mounted() {
- 初始化webSocket
- this.initWebSocket();
- }
复制代码 第四步、启动前后端代码
- @Autowired
- private WebSocketService webSocket;
- @Test
- public void test(){
- webSocket.sendMessage("后端发送了一条消息");
- }
复制代码
- 图片省略…
- 此时当前后端都启动成功时,前端页面打开F12查看console页面时就可以看到 “连接成功” 字样,当后端发出消息时,也会打印 “收到消息...” 字样
复制代码 - 固然WebSocket还有非常多的功能,前端也可以向后端发送消息,后端也可以发送定向消息,有爱好的朋友可以多多研究
本次教程到这里就竣事了,希望各人多多关注支持(首席摸鱼师 微信同号),持续跟踪最新文章吧~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |