快学快用:2分钟学会WebSocket!

已有241人围观 来源:程序员洋哥 发布于:2024-09-12 17:29:58

大家好,我是洋哥,一个工作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连接和消息推送功能。连接成功后,可以观察到服务器推送的消息,并在客户端接收到这些消息。


欢迎关注我的公众号“程序员洋哥”,原创技术文章第一时间推送。

© 2022-2024. All rights reserved. 梦想PHP.

声明:本站所有内容均为自动采集而来,如有侵权,请联系删除 苏ICP备06013646号-6