springboot中使用websocket

最近项目中一个需求,需要从服务器端推送消息到浏览器端,浏览器端接收到消息推送执行弹窗提示。
这里选用了websocket,记录下使用步骤,项目使用的springboot。

  • 引入依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
            <version>2.1.4.RELEASE</version>
        </dependency>
  • 开启websocket
@Configuration
public class WebSocketConfig {

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

}
  • 创建webSocketSever
@ServerEndpoint("/yourServerPath")
@Component("YourServerName")
@Slf4j
public class MotorAlarmWebSocketServer {

    // concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象
    private static final CopyOnWriteArraySet<MotorAlarmWebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();


    public static Set<MotorAlarmWebSocketServer> getWebSocketSet(){
        return webSocketSet;
    }

    // 与某个客户端的连接会话,需要通过它来与客户端进行数据收发
    private Session session;
    
    @OnOpen
    public void onOpen(Session session) throws IOException {
        this.session = session;
        webSocketSet.add(this);
        log.info("系统连接成功");

    }

    @OnClose
    public void onClose() {
        webSocketSet.remove(this);
    }

    /**
     * 收到客户端消息后调用的方法
     */
    @OnMessage
    public void onMessage(String message) {
        //群发消息
        for (MotorAlarmWebSocketServer item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                log.info("消息发送失败");
            }
        }}

    @OnError
    public void onError(Session session, Throwable error) {
        log.info("断开连接");
    }

    /**
     * 实现服务器主动推送
     */
    public void sendMessage(String message) throws IOException {
        for (MotorAlarmWebSocketServer item : webSocketSet) {
            if (item.session.isOpen()) {
                item.session.getBasicRemote().sendText(message);
            }
        }
    }

这样当后台启动项目时,webSocket也就同时启动,同时会监听接入的链接,业务逻辑中可以调用该方法的sendMessage方法会向接入的链接发送。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容