2022-01-24 springboot 之 WebSocket

贾建茗
2023-12-01

WebSocket

websocket是基于http协议实现的,为了解决http只能由客户端请求服务器端进行访问的解决方案。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在springboot中可以导入spring-boot-starter-websocket依赖进行使用

spring-boot-starter-websocket使用

导入依赖

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

配置类

package com.zsl.config.websocket;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * @Author zsl
 * @Date 2022/1/23 17:12
 */
@Configuration
@EnableWebSocket	//开启websocket
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

编写使用类

package com.zsl.config.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

/**
 * 原生 websocket 基本使用
 * @Author zsl
 * @Date 2022/1/23 17:57
 */
@Slf4j
@Service
@ServerEndpoint("/api/websocket")   // websocket接口与@RequestMapping功能相同 url: ws://ip:port/api/websocket
public class WebSocketServer {

    /**
     * 建立连接,基于http(三次握手)协议
     */
    @OnOpen
    public void onOpen(Session session) {
        log.info("onOpen...");
    }

    /**
     * 关闭连接
     */
    @OnClose
    public void onClose() {
        log.info("onClose...");
    }

    /**
     * 数据传输
     */
    @OnMessage
    public void onMessage(String text, Session session) {
        log.info("onMessage... text = {}", text);
        try {
            session.getBasicRemote().sendText("echo: " + text);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 出现异常时执行
     */
    @OnError
    public void onError(Session session, Throwable t) {
        log.info("onError...");
        log.debug("throwable = {}", t.getMessage());
    }
}

注解使用

@ServerEndpoint

通过这个 spring boot 就可以知道你暴露出去的 ws 应用的路径,有点类似我们经常用的@RequestMapping。比如你的启动端口是 8080,而这个注解的值是 ws,那我们就可以通过 ws://127.0.0.1:8080/ws 来连接你的应用

@OnOpen

当 websocket 建立连接成功后会触发这个注解修饰的方法,注意它有一个 Session 参数

@OnCloes

当 websocket 建立的连接断开后会触发这个注解修饰的方法,注意它有一个 Session 参数

@OnMessage

当客户端发送消息到服务端时,会触发这个注解修改的方法,它有一个 String 入参表明客户端传入的值

@OnError

当 websocket 建立连接时出现异常会触发这个注解修饰的方法,注意它有一个 Session 参数

参考文章(【websocket】spring boot 集成 websocket 的四种方式)

 类似资料: