前言

WebSocket 是一种在客户端和服务器之间进行全双工通信的协议,相比传统的 HTTP 请求-响应模型,它可以提供更低的延迟和更高的实时性。WebSocket 在聊天应用、实时通知、在线协作、游戏开发等场景中得到了广泛的应用。

在实际开发中,WebSocket 可以通过多种方式进行集成,本文盘点了 6 种常见的 WebSocket 集成方式,分别是:

  1. 使用 Java 原生 WebSocket API
  2. Spring Boot + WebSocket
  3. Spring Boot + STOMP + SockJS
  4. Netty 实现 WebSocket 服务器
  5. WebSocket + Redis 实现集群广播
  6. WebSocket + MQTT 进行物联网通信

每种方式都有其适用场景和实现方式,接下来我们逐一介绍。


1. 使用 Java 原生 WebSocket API

Java 从 Java EE 7 开始支持 WebSocket API,可以直接基于 javax.websocket 进行开发。

示例代码

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

@ServerEndpoint("/websocket")
public class MyWebSocketServer {
    private static final CopyOnWriteArraySet<Session> sessions = new CopyOnWriteArraySet<>();

    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
    }

    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        for (Session s : sessions) {
            s.getBasicRemote().sendText("Echo: " + message);
        }
    }

    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
    }
}

适用场景

适合 轻量级 WebSocket 服务器,但扩展性有限,不适用于大规模应用。


2. Spring Boot + WebSocket

Spring Boot 通过 @ServerEndpoint 注解可以轻松集成 WebSocket。

示例代码

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/ws").setAllowedOrigins("*");
    }
}

适用场景

适用于 Spring Boot 应用,可以快速搭建 WebSocket 服务。


3. Spring Boot + STOMP + SockJS

使用 STOMP(Simple Text Oriented Messaging Protocol) 进行消息传输,并结合 SockJS 兼容不支持 WebSocket 的浏览器。

示例代码

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket").withSockJS();
    }
}

适用场景

适合 需要消息代理(Message Broker)的应用,如聊天室、实时消息推送等。


4. Netty 实现 WebSocket 服务器

Netty 是一个高性能的 NIO 网络框架,适合构建大规模 WebSocket 服务器。

示例代码

public class WebSocketServer {
    public static void main(String[] args) throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(new WebSocketServerInitializer());
            
            Channel channel = bootstrap.bind(8080).sync().channel();
            channel.closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

适用场景

适合 高并发、大流量 WebSocket 服务器


5. WebSocket + Redis 实现集群广播

分布式环境 下,可以利用 Redis 发布/订阅(Pub/Sub) 进行消息广播。

示例代码

@Service
public class RedisMessageSubscriber implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String msg = new String(message.getBody());
        WebSocketServer.broadcast(msg);
    }
}

适用场景

适用于 多实例部署的 WebSocket 服务器,保证集群内消息同步。


6. WebSocket + MQTT 进行物联网通信

结合 MQTT(Message Queuing Telemetry Transport) 进行 WebSocket 通信。

示例代码

MqttClient client = new MqttClient("tcp://broker.hivemq.com:1883", MqttClient.generateClientId());
client.connect();
client.subscribe("iot/topic");

适用场景

适合 物联网(IoT)设备通信,如智能家居、远程控制等。


总结

方式

适用场景

Java 原生 WebSocket API

适合轻量级 WebSocket 服务器

Spring Boot + WebSocket

适合 Spring Boot 开发

Spring Boot + STOMP + SockJS

适合消息代理场景

Netty WebSocket

适合高并发 WebSocket 服务器

WebSocket + Redis

适合分布式 WebSocket 服务器

WebSocket + MQTT

适用于 IoT 设备通信

不同的 WebSocket 集成方式适用于不同的应用场景,开发者可以根据自己的业务需求选择合适的方案。