基于WebSocket实现一个简易的群聊功能(一)

pivoteic
发布于 2022-6-16 17:48
浏览
0收藏

 

本文主要来讲解如何使用WebSocket来实现一个简易的群聊功能。

 

引入maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>


项目的目录结构

基于WebSocket实现一个简易的群聊功能(一)-鸿蒙开发者社区
接下来,我们来分析每个类的作用。

 

WebSocketApplication

@SpringBootApplication
public class WebSocketApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebSocketApplication.class, args);
    }
}


这个类就是一个简单的启动引导类的功能。

 

WebSocketServer:群聊核心类

@Component
@ServerEndpoint(value = "/chat/{username}", configurator = SpringBasedConfigurator.class)
public class WebSocketServer {
    private final Map<Session, String> userSessionMap = new ConcurrentHashMap<>();

    @OnOpen
    public void onOpen(Session session, @PathParam("username") String username) {
        userSessionMap.put(session, username);
        multicastMessage(session, "欢迎" + username + "加入群聊!");
    }

    @OnMessage
    public void onMessage(Session session, String message) {
        String username = userSessionMap.get(session);
        multicastMessage(session, username + ": " + message);
    }

    @OnClose
    public void onClose(Session session) {
        String username = userSessionMap.remove(session);
        multicastMessage(session, username + "退出群聊。");
    }

    private void multicastMessage(Session session, String message) {
        for (Session userSession : userSessionMap.keySet()) {
            if (userSession == session) {
                //是自己,忽略
                continue;
            }
            try {
                userSession.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


@ServerEndpoint:作用是用来表明当前类是一个节点类,当连接成功之后,用户的操作都会回调这个类对应的对象的方法,对象怎么创建的是根据configurator 属性对应的类来实现的,默认是每个连接对应的对象都是通过反射构建的,但是对于本群聊功能来说,是通过SpringBasedConfigurator对象来获取,这个类的作用接下来会剖析。

 

@OnOpen:当客户端与服务端建立连接的时候,会回调 @OnOpen 注解标记的方法

 

@PathParam:可以看成跟spring mvc中的@PathVariable注解作用一样,就是取出连接路径中的占位符对应的值

 

@OnMessage:当客户端发送消息给服务端的时候,会回调OnMessage 注解标记的方法

 

@OnClose:当客户端断开连接的时候,会回调@OnClose注解标记的方法。

 

Session:是代表当前客户端与服务端建立的一个会话,通过这个对象,服务端可以主动给客户端发送消息。

 

WebSocketServer这个类的主要作用是保存每个客户端与服务端建立的连接,一旦有客户端跟服务端建立连接、发送消息、断开连接,都会发送消息给其他客户端,从而实现群聊的功能。

 

文章转自公众号:三友的java日记

标签
已于2022-6-16 17:48:26修改
收藏
回复
举报
回复
    相关推荐