Spring Boot+WebSocket实现消息推送

57 篇文章 10 订阅

具体步骤如下,

1、在pom.xml文件中引入坐标

<!--websocket-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-websocket</artifactId>
		</dependency>

2、为Spring Boot项目编写WebSocket配置类


/**
 * WebSocket配置类
 * */
@Component
public class WebSocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }

}

3、编写服务端-WebSocket消息监听类

PS:WebSocket.java类中给出的@ServerEndpoint("/websocket")注解,提供了前端代码中用于实例化WebSocket的访问路径

import org.apache.ibatis.logging.Log;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

@Component
@ServerEndpoint("/websocket")//WebSocket访问地址
public class WebSocket {
    private Session session;
    //WebSocket容器,存储Session实例
    private static CopyOnWriteArraySet<WebSocket> webSocketSet=new CopyOnWriteArraySet<>();

    //对应前端的请求
    /**
     * 打开连接
     * */
    @OnOpen
    public void onOpen(Session session){
        this.session=session;
        webSocketSet.add(this);
        System.out.println("【websocket消息】有新的连接,总数{"+webSocketSet.size()+"}");
    }

    /**
     * 关闭连接
     * */
    @OnClose
    public void onClose(){
        webSocketSet.remove(this);
        System.out.println("【websocket消息】连接断开,总数{"+webSocketSet.size()+"}");
    }

    /**
     * 接收消息
     * */
    @OnMessage
    public void onMessage(String message){
        System.out.println("【websocket消息】收到客户端发来的消息{"+message+"}");
    }

    /**
     * 发送消息
     * */
    public void sendMessage(String message){
        //遍历存储的WebSocket实例
        for (WebSocket webSocket : webSocketSet){
            //广播消息
            System.out.println("【websocket消息】广播消息{"+message+"}");
            //发送消息
            try {
                webSocket.session.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

4、编写客户端-WebSocket消息监听模块

var websocket = null
    //浏览器是否支持
if ('WebSocket' in window) {
    // 上面我们给webSocket定位的路径
    //IP:localhost:8088/springboot-bysj   访问路径:/websocket
    websocket = new WebSocket('ws://localhost:8088/websocket')
} else {
    alert('该浏览器不支持websocket!')
}
//建立连接
websocket.onopen = function(event) {
        console.log('建立连接')
    }
    //关闭连接
websocket.onclose = function(event) {
        console.log('连接关闭')
    }
    //消息来的时候的事件
websocket.onmessage = function(event) {
    // 这里event.data就是我们从后台推送过来的消息
    console.log('收到消息:' + event.data)
        // 在这里我们可以在页面中放置一个音乐,例如“您有新的订单了!”这样的提示音
}

//发生错误时
websocket.onerror = function() {
        alert('websocket通信发生错误!')
    }
    //窗口关闭时,Websocket关闭
window.onbeforeunload = function() {
    websocket.close()
}
//到处当前模块
module.exports = websocket

5、建立Socket连接

此时,只需要在前端工程的主模块中引入WebSocket.js文件,即可在项目初始化时与服务端之间建立WebSocket连接。
在这里插入图片描述

图 客户端-建立WebSocket连接提示

6、利用WebSocket技术实现消息推送

通过上面的步骤,已经实现了客户端与服务端的双向消息连接,接下来,通过编写服务端接口,实现消息推送。

6.1 服务端消息服务接口

为了便于测试,可编写如下的接口,供客户端访问。

package com.example.demo01.Service;

import com.example.demo01.Entity.WebSocket;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RestController
public class WebSocketService {
    //自动注入
    @Autowired
    private WebSocket webSocket;

    //客户端发送request请求,出发以下方法
    @RequestMapping("/createorder")
    public String createOrder(HttpServletRequest request, HttpServletResponse response) {
        //获取cookie中的订单号
        webSocket.sendMessage("有新的订单");
        return "success";
    }
    @RequestMapping("/deleteorder")
    public String deleOrder(HttpServletRequest request,HttpServletResponse response){
        //删除订单
        webSocket.sendMessage("删除订单");
        return "delete success";
    }

}

6.2 客户端请求数据接口

简单起见,可直接在浏览器地址栏中输入接口访问路径,例如:

http://localhost:8088/deleteorder

可以看到浏览器页面中内容变化如下,
在这里插入图片描述
同时,前端项目中的控制台会打印如下信息,
在这里插入图片描述
至此,大家应该明白如何使用WebSocket技术实现消息推送了吧。
总结如下,

1】在服务端编写可供客户端访问的数据接口,并借助WebSocket实例进行消息广播;
【2】在客户端访问服务端提供的数据接口,并通过WebSocket实例的onmessage方法接收服务端推送的消息内容,
并执行相应的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是席木木啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值