TextWebSocketHandler 和 @ServerEndpoint 各自实现 WebSocket 服务器
TextWebSocketHandler 和 @ServerEndpoint 都可以用于实现 WebSocket 服务器,但它们属于不同的技术栈,使用方式和功能有一些区别。以下是它们的对比:
1. 技术栈对比
| 特性 | TextWebSocketHandler(Spring) | @ServerEndpoint(Java EE/JSR-356) | 
|---|---|---|
| 所属框架 | Spring Framework | Java 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。
