0%

springboot集成websocket

添加依赖

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

添加websocket配置类

@Configuration
public class WebSocketConfig {
    /**
     * 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

添加websocket Endpoint

@Slf4j
@Component 
@ServerEndpoint("/ws/{name}")
public class WebSocketTest {
    // @Component 虽然表示是springboot的单例,但是这个创建的单例并不会用到.
    // 实际新的websocket连接进来的时候, 会创建新的 WebSocketTest 实例,所以这里的name、session属性都是该连接私有的
    private String name;
    private Session session;

    // 可以创建一个构造器测试,是不是新的websocket连接进来会创建新的实例.
    // public WebSocketTest() {
    //     System.out.println("创建");
    // }

    // 可以创建一个静态属性保存所有的websocket连接
    // private static ConcurrentHashMap<String, WebSocketTest> webSocketSet = new ConcurrentHashMap<>();

    @OnOpen
    public void onOpen(Session session, @PathParam(value = "name") String name) {
        this.name = name;
        this.session = session;
        // name 是用来表示唯一客户端
        webSocketSet.put(name, this);
        System.out.println("OnOpen");
    }

    @OnClose
    public void OnClose() {
        System.out.println("OnClose");
    }

    @OnMessage
    public void OnMessage(String msg) throws IOException {
        System.out.println(msg);
        session.getBasicRemote().sendText("Hello " + name);
    }

    @OnError
    public void onError(Session session, Throwable error) {
        log.info("发生错误");
        error.printStackTrace();
    }
}

测试

可以通过在线 websocket 客户端来测试你的 ws 服务:http://coolaf.com/tool/chattest.