当前位置: 首页 > news >正文

TextWebSocketHandler 和 @ServerEndpoint 各自实现 WebSocket 服务器

TextWebSocketHandler@ServerEndpoint 都可以用于实现 WebSocket 服务器,但它们属于不同的技术栈,使用方式和功能有一些区别。以下是它们的对比:


1. 技术栈对比

特性TextWebSocketHandler (Spring)@ServerEndpoint (Java EE/JSR-356)
所属框架Spring FrameworkJava EE 标准 (JSR-356)
依赖需要 Spring Boot 或 Spring WebSocket需要 Java EE 或兼容的实现(如 Tyrus)
配置方式基于 Spring 配置,使用 WebSocketConfigurer基于注解,直接标记类为 WebSocket 端点
功能扩展支持 Spring 的拦截器、消息转换等功能功能较为基础,依赖 Java EE 标准
适用场景适合 Spring 项目适合纯 Java EE 项目或非 Spring 项目

2. 功能对比

TextWebSocketHandler (Spring)
  • 是 Spring 框架提供的 WebSocket 处理器。
  • 需要配合 WebSocketConfigurer 进行配置。
  • 支持更高级的功能,如:
    • 消息转换(将消息转换为 Java 对象)。
    • 拦截器(在连接建立或关闭时执行额外逻辑)。
    • 与 Spring 生态无缝集成(如依赖注入、AOP 等)。

示例:

import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

public class MyTextWebSocketHandler extends TextWebSocketHandler {

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        System.out.println("收到客户端消息: " + message.getPayload());
        session.sendMessage(new TextMessage("服务器回复: " + message.getPayload()));
    }

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("客户端连接成功: " + session.getId());
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        System.out.println("客户端断开连接: " + session.getId());
    }
}

配置类:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyTextWebSocketHandler(), "/ws")
                .setAllowedOrigins("*");
    }
}

@ServerEndpoint (Java EE/JSR-356)
  • 是 Java EE 标准(JSR-356)提供的注解。
  • 直接标记一个类为 WebSocket 端点。
  • 功能较为基础,适合简单的 WebSocket 应用。
  • 需要依赖 Java EE 或兼容的实现(如 Tyrus)。

示例:

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/ws")
public class MyWebSocketServer {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("客户端连接成功: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("收到客户端消息: " + message);
        try {
            session.getBasicRemote().sendText("服务器回复: " + message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("客户端断开连接: " + session.getId());
    }

    @OnError
    public void onError(Session session, Throwable throwable) {
        System.out.println("发生错误: " + throwable.getMessage());
    }
}

3. 使用场景对比

场景TextWebSocketHandler (Spring)@ServerEndpoint (Java EE/JSR-356)
Spring 项目推荐使用,与 Spring 生态无缝集成不推荐,功能较为基础
非 Spring 项目不适用推荐使用,纯 Java EE 标准
需要高级功能(如拦截器)支持不支持
需要消息转换支持不支持
需要依赖注入支持不支持

4. 总结

  • TextWebSocketHandler

    • 属于 Spring 框架,功能强大,支持拦截器、消息转换等高级特性。
    • 适合 Spring 项目,尤其是需要与 Spring 生态集成的场景。
  • @ServerEndpoint

    • 属于 Java EE 标准,功能较为基础,使用简单。
    • 适合非 Spring 项目或简单的 WebSocket 应用。

如果你的项目基于 Spring,推荐使用 TextWebSocketHandler;如果是纯 Java EE 项目或非 Spring 项目,可以使用 @ServerEndpoint

相关文章:

  • Deepseek-v3 / Dify api接入飞书机器人go程序
  • 127,【3】 buuctf [NPUCTF2020]ReadlezPHP
  • 云原生AI Agent应用安全防护方案最佳实践(上)
  • 不到一个月,SQLite 3.49.0来了
  • 本地事务简介
  • 【进程与线程】进程之间的通信
  • 16.React学习笔记.React更新机制
  • 【DeepSeek × Postman】请求回复
  • LogicFlow自定义节点:矩形、HTML(vue3)
  • Java 入门核心基础学习 + 开源项目 + 思维导图
  • 深度学习|表示学习|CNN中的Layer Normalization | 25
  • 数据可视化
  • 深度解析策略模式:从理论到企业级实战应用
  • Unity-Mirror网络框架-从入门到精通之Multiple Additive Scenes示例
  • iOS主要知识点梳理回顾-5-运行时方法交换
  • Jmeter+Influxdb+Grafana平台监控性能测试过程
  • STM32F407通过FSMC扩展外部SRAM和NAND FLASH
  • Gitlab中如何进行仓库迁移
  • 游戏应用谷歌后台使用介绍
  • 设计模式Python版 命令模式(上)
  • 普雷沃斯特当选新一任天主教罗马教皇
  • 第1现场 | 50多年来首次!印度举行大规模民防演习
  • 王日春已任教育部社会科学司司长,此前系人教社总编辑
  • 外交部回应中美经贸高层会谈:这次会谈是应美方请求举行的
  • 五一假期上海楼市延续向好态势,成交量同比增加36%
  • 习近平同欧洲理事会主席科斯塔、欧盟委员会主席冯德莱恩就中欧建交50周年互致贺电