大家好,我是洋哥,一个工作7年的Java程序员。今天我们聊聊WebSocket。
啥是WebSocket?
WebSocket协议为实现服务器与客户端之间的实时通信提供了一个有效的解决方案。它允许在浏览器和服务器之间建立一个全双工通信通道,这意味着双方都可以主动发送信息。
SpringBoot整合WebSocket
首先,为了在SpringBoot项目中使用WebSocket,需要添加相应的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
接下来,创建一个配置类以启用WebSocket:
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
为了管理WebSocket的连接,可以创建一个工具类WebsocketUtil
,它使用一个ConcurrentHashMap
来记录当前在线的Session:
public class WebsocketUtil {
private static final Map<String, Session> ONLINE_SESSION = new ConcurrentHashMap<>();
public static void addSession(String userId, Session session) {
ONLINE_SESSION.putIfAbsent(userId, session);
}
public static void removeSession(String userId) {
ONLINE_SESSION.remove(userId);
}
public static void sendMessage(Session session, String message) {
if (session != null) {
session.getAsyncRemote().sendText(message);
}
}
public static void sendMessageForAll(String message) {
ONLINE_SESSION.forEach((sessionId, session) -> sendMessage(session, message));
}
}
然后,定义一个WebSocket接口处理类WebsocketController
,它使用@ServerEndpoint
注解来指定WebSocket的端点:
@Component
@ServerEndpoint(value = "/chat/{userId}")
public class WebsocketController {
@OnOpen
public void onOpen(@PathParam(value = "userId") String userId, Session session) {
WebsocketUtil.addSession(userId, session);
}
@OnClose
public void onClose(@PathParam(value = "userId") String userId, Session session) {
WebsocketUtil.removeSession(userId);
}
@OnMessage
public void onMessage(@PathParam(value = "userId") String userId, Session session, String message) {
WebsocketUtil.sendMessageForAll("[" + userId + "]:" + message);
}
@OnError
public void onError(Session session, Throwable throwable) {
try {
session.close();
} catch (IOException e) {
e.printStackTrace();
}
throwable.printStackTrace();
}
}
最后,可以通过一个REST接口来实现服务器端向特定用户推送消息的功能:
@PostMapping("/send")
public void send(@RequestParam("id") String id, @RequestParam("message") String message) {
Session session = WebsocketUtil.getOnlineSession(id);
WebsocketUtil.sendMessage(session, message);
}
测试
可以使用工具如Apifox来测试WebSocket连接和消息推送功能。连接成功后,可以观察到服务器推送的消息,并在客户端接收到这些消息。
欢迎关注我的公众号“程序员洋哥”,原创技术文章第一时间推送。