springboot创建websocket服务-ws方式

#pom依赖

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

 

#配置类

复制代码
@Configuration
public class WebSocketConfig {
 
    /**
     * 首先在该类中注入一个ServerEndpointExporter的bean,
     * ServerEndpointExporter这个bean会自动注册使用了@ServerEndpoint这个注解的websocket endpoint
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
 
}
复制代码

 

#服务端

复制代码
@Slf4j
@Component
@ServerEndpoint("/")
public class MyWebSocketServer {
 
    
    /**
     * 静态变量,用来记录当前连接数
     */
    private static final AtomicInteger ONLINE_COUNT = new AtomicInteger();
 
    /**
     * concurrent线程安全set,用来存放每个客户端对应的MyWebSocketServer对象
     */
    public static final CopyOnWriteArraySet<MyWebSocketServer> WEBSOCKETS = new CopyOnWriteArraySet<>();
 
    /**
     * 与每个客户端的连接会话,需要通过它来给客户端发送数据
     */
    private Session session;
 
    /**
     * 连接成功调用的方法
     *
     * @param session 可选的参数。与某个客户端的连接会话
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        WEBSOCKETS.add(this);
        ONLINE_COUNT.incrementAndGet();
        log.info("有新的连接加入!当前连接总数为{}", ONLINE_COUNT.get());
    }
 
    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        WEBSOCKETS.remove(this);
        ONLINE_COUNT.decrementAndGet();
        log.info("有一连接关闭!当前连接总数为{}", ONLINE_COUNT.get());
    }
 
    @OnMessage
    public void onMessage(String message) {
        log.info("WebSocket接收消息:sessionId为{},消息为:{}", this.session.getId(), message);
    }
 
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("WebSocket接收消息错误{},sessionId为{}", error.getMessage(), session.getId());
        error.printStackTrace();
    }
 
    public void sendMessage(String message) {
        log.info("WebSocket发送消息:sessionId为{},消息为:{}", this.session.getId(), message);
        try {
            this.session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            log.error("WebSocket发送消息错误{},sessionId为{}", e.getMessage(), session.getId(), e);
        }
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        MyWebSocketServer that = (MyWebSocketServer) o;
        return Objects.equals(session, that.session);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(session);
    }
}
复制代码

 

#连接地址

ws://ip:port/context-path/webSocket

 

#在线测试地址

http://coolaf.com/tool/chattest

posted @   家乐先生  阅读(1764)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示