欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springboot整合websocket实现群聊思路代码详解

程序员文章站 2022-03-03 09:41:29
实现思路发送者向服务器发送大家早上好。其它客户端可以收到对应消息。项目展示通过springboot引入websocket,实现群聊,通过在线websocket测试进行展示。核心代码pom引入jar&l...

实现思路

springboot整合websocket实现群聊思路代码详解

发送者向服务器发送大家早上好。其它客户端可以收到对应消息。

项目展示

springboot整合websocket实现群聊思路代码详解

通过springboot引入websocket,实现群聊,通过在线websocket测试进行展示。

核心代码

pom引入jar

<parent>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-parent</artifactid>
        <version>2.3.10.release</version>
        <relativepath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-web</artifactid>
        </dependency>
        <dependency>
            <groupid>org.apache.commons</groupid>
            <artifactid>commons-lang3</artifactid>
        </dependency>

        <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
            <version>1.18.12</version>
        </dependency>

        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-websocket</artifactid>
        </dependency>
        <dependency>
            <groupid>com.alibaba</groupid>
            <artifactid>fastjson</artifactid>
            <version>1.2.62</version>
        </dependency>
    </dependencies>

使用springboot 2.3.10.release版本;java8

websocketconfig配置类

@configuration
public class websocketconfig
{
   @bean
   public serverendpointexporter serverendpointexporter() 	{
      return new serverendpointexporter();
   }
}

websocket有4个注解,解释如下

  • @onopen 有新连接
  • @onmessage 有新消息时
  • @onclose 关闭连接
  • @onerror 连接异常

对于这个4个注解,配置在方法上即可。

websocketserverendpoint接收类

@slf4j
@controller
@serverendpoint ("/")
public class websocketserverendpoint
{
   @onopen
   public void onopen(session session, endpointconfig config) {
      log.info("[onopen][session({}) 接入]", session);
      websocketutil.broadcast (session.getid ()+"上线了");
      websocketutil.addsession (session);
   }
   @onmessage
   public void onmessage(session session, string message) {
      websocketutil.broadcast (message);
      log.info("[onopen][session({}) 接收到一条消息({})]", session, message); // 生产环境下,请设置成 debug 级别
   }
   @onclose
   public void onclose(session session, closereason closereason) {
      websocketutil.removesession (session);
      websocketutil.broadcast (session.getid ()+"下线了");
      log.info("[onclose][session({}) 连接关闭。关闭原因是({})}]", session, closereason);
   }
   @onerror
   public void onerror(session session, throwable throwable) {
      log.info("[onclose][session({}) 发生异常]", session, throwable);
   }
}

websocketutil工具类

@slf4j
public class websocketutil
{


    // ========== 会话相关 ==========

    /**
     * session 与用户的映射
     */
    private static final map<string, session> session_user_map = new concurrenthashmap<> ();

    /**
     * 添加 session 。在这个方法中,会添加用户和 session 之间的映射
     *
     * @param session session
     */
    public static void addsession(session session) {
        // 更新 session_user_map
        session_user_map.put(session.getid (), session);
    }

    /**
     * 移除 session 。
     *
     * @param session session
     */
    public static void removesession(session session) {
        // 从 session_user_map 中移除
          session_user_map.remove(session.getid ());

    }

    // ========== 消息相关 ==========

    /**
     * 广播发送消息给所有在线用户
     *
     * @param message 消息体
     * @param <t> 消息类型
     */
    public static <t extends message> void broadcast(string message) {
        // 创建消息
//        string messagetext = buildtextmessage(type, message);
        // 遍历 session_user_map ,进行逐个发送
        for (string sessionid : session_user_map.keyset()) {
            sendtextmessage(session_user_map.get (sessionid), message);
        }
    }

    /**
     * 发送消息给单个用户的 session
     *
     * @param session session
     * @param type 消息类型
     * @param message 消息体
     * @param <t> 消息类型
     */
    public static <t extends message> void send(session session, string type, t message) {
        // 创建消息
        string messagetext = buildtextmessage(type, message);
        // 遍历给单个 session ,进行逐个发送
        sendtextmessage(session, messagetext);
    }


    /**
     * 构建完整的消息
     *
     * @param type 消息类型
     * @param message 消息体
     * @param <t> 消息类型
     * @return 消息
     */
    private static <t extends message> string buildtextmessage(string type, t message) {
        jsonobject messageobject = new jsonobject();
        messageobject.put("type", type);
        messageobject.put("body", message);
        return messageobject.tostring();
    }

    /**
     * 真正发送消息
     *
     * @param session session
     * @param messagetext 消息
     */
    private static void sendtextmessage(session session, string messagetext) {
        if (session == null) {
            log.error("[sendtextmessage][session 为 null]");
            return;
        }
        remoteendpoint.basic basic = session.getbasicremote();
        if (basic == null) {
            log.error("[sendtextmessage][session 的  为 null]");
            return;
        }
        try {
            basic.sendtext(messagetext);
        } catch (ioexception e) {
            log.error("[sendtextmessage][session({}) 发送消息{}) 发生异常",
                    session, messagetext, e);
        }
    }

}

在线websocket调试输入ws://localhost:8080/即可。

以上就是springboot整合websocket实现群聊思路代码详解的详细内容,更多关于springboot整合websocket的资料请关注其它相关文章!