跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 基于 springboot websocket 的群聊实现
未分類
2 2 月 2021

基于 springboot websocket 的群聊实现

基于 springboot websocket 的群聊实现

資深大佬 : Aidenboss 3

基于 springboot websocket 的群聊实现

功能列表

  • 分布式
  • 同一帐号多设备登录
  • 群聊
  • 多设备
  • 简单鉴权
  • 心跳检查

依赖

  • maven
  • jdk11
  • redis

redis 配置

redis 默认使用 localhost:6379 。如果需要修改 host:port,可以修改 application.yml
redis 仅仅用于存储用户 username / password

源码分析

Auth 过程
String username = ((ServletServerHttpRequest) request)   .getServletRequest().getParameter(USERNAME); String password = ((ServletServerHttpRequest) request)   .getServletRequest().getParameter(PASSWORD); User user = userService.register(username, password); // 将 user 设置到 attributes 中 attributes.put(USER, user); return true; 
连接创建
// 1. 添加 session sessionService.add(session); // 2. 按 username + sessionId 生成 redis key,并进行订阅,这样做可以支持多设备同一个帐号登录 MessageListener messageListener = (message, pattern) -> {   log.info("Redis sub receive: [{}]", new String(message.getBody()));   try {     session.sendMessage(new TextMessage(message.getBody()));   } catch (IOException e) {     log.error("", e);   } }; redisMessageListenerContainer.addMessageListener(messageListener,   new ChannelTopic(String.format("sub:%s:%s", SessionUtil.getUsernameFromSession(session), session.getId()))); // 由于 session 会断开,需要保存下来,以待 removeListener messageListenerMap.put(session, messageListener); 
监听消息
// 获取所有在线的 session,然后通过 redis pub 功能转发消息 sessionService.getSessions()   .forEach(session -> subPubService.pub(session, textMessage)); 
心跳检查
// 核心逻辑是一个定时任务,通过延时队列 poll 实现。 // 其中 HeartbeatSessionTask 封装了 session 和对应的过期时间 this.executorService.submit(() -> {   while (true) {     try {       HeartbeatSessionTask task;       while ((task = queue.poll()) != null) {         task.getSession().close();         log.warn("[{}] is dead, so close", SessionUtil.getUsernameFromSession(task.session));       }     } catch (Exception e) {       log.error("", e);     }     Thread.sleep(TimeUnit.SECONDS.toMillis(1));   } }); 

使用

服务端启动

启动后,会监听 localhost:8080 端口
其中,websocket url 为 ws:localhost:8080/ws
获取在线用户数接口为 http://localhost:8080/session/page

shell 测试

使用 wscat 测试

wscat -c 'ws://localhost:8080/ws?username=aiden&password=123' 
前端测试

由于有简单的帐号体系,链接时需要制定 username / password,若 username 不存在,则直接注册成功;否则会判断 username / password 是否匹配
如 ws://localhost:8080/ws?username=aiden&password=123 才能进行连接 图示: 基于 springboot websocket 的群聊实现

大佬有話說 (4)

  • 資深大佬 : wuvvu

    支持支持

  • 資深大佬 : agentFitzzzzz

    不错

  • 資深大佬 : razertory

    直接一个 Akka 就能搞定 https://doc.akka.io/docs/akka/1.3.1/scala/tutorial-chat-server.html.

  • 主 資深大佬 : Aidenboss

    @razertory 感觉定位不太一样

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具