实现思路

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

项目展示

通过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的资料请关注www.887551.com其它相关文章!