基于 springboot websocket 的群聊实现

Overview

基于 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(genSubKey(session)));
// 由于 session 会断开,需要保存下来,以待 removeListener
messageListenerMap.put(session, messageListener);
监听消息
// 获取所有在线的 session,然后通过 redis pub 功能转发消息
sessionService.getSessions()
  .forEach(session -> pubSubService.pub(session, textMessage));
心跳检查
// 核心逻辑是使用分桶策略,一共有 10 个桶,每个桶有对应的定时任务和延迟队列
// 延迟队列使用了 HeartbeatSessionTask, 其中 HeartbeatSessionTask 封装了 session 和对应的过期时间

static final int BUCKET_SIZE = 10;

// 每个 session 进入桶时,会根据 sessionId.hashCode() & BUCKET_SIZE 选择桶
bucket[Math.abs(session.getId().hashCode() % BUCKET_SIZE)].add(new HeartbeatSessionTask(session));

// 启动每个桶的定时任务
for (int i = 0; i < BUCKET_SIZE; i++) {
  bucket[i] = new DelayQueue<>();
  executors[i] = Executors.newSingleThreadExecutor();
  int index = i;

  executors[index].submit(() -> {
    while (true) {
      try {
        HeartbeatSessionTask task;
        while ((task = bucket[index].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 才能进行连接 图示:

You might also like...

基于WebSocket实现Web端聊天系统【Vue+SpringBoot】

本项目里面的demo后端都是基于Java,前端基于Vue,数据库MySql。 一、运行demo 下载代码后,先配置好yml文件:数据库和微信号appid、secret(other包下面有数据库)。

Jan 6, 2023

以教学为目的的电商系统。包含ToB复杂业务、互联网高并发业务、缓存应用;DDD、微服务指导。模型驱动、数据驱动。了解大型服务进化路线,编码技巧、学习Linux,性能调优。Docker/k8s助力、监控、日志收集、中间件学习。前端技术、后端实践等。主要技术:SpringBoot+JPA+Mybatis-plus+Antd+Vue3。

以教学为目的的电商系统。包含ToB复杂业务、互联网高并发业务、缓存应用;DDD、微服务指导。模型驱动、数据驱动。了解大型服务进化路线,编码技巧、学习Linux,性能调优。Docker/k8s助力、监控、日志收集、中间件学习。前端技术、后端实践等。主要技术:SpringBoot+JPA+Mybatis-plus+Antd+Vue3。

简介 bcMall 是一个以教学为目的的电商系统。bcMall将为你展现一个典型的系统演进过程,所使用的主流技术完全开放。 它包含ToB复杂业务、互联网高并发业务、缓存应用;DDD、微服务指导。模型驱动、数据驱动。了解大型服务进化路线,编码技巧、学习Linux,性能调优。Docker/k8s助力、监

Jan 3, 2023

🦄 开源社区系统:基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供详细的开发文档和配套教程。包含帖子、评论、私信、系统通知、点赞、关注、搜索、用户设置、数据统计等模块。

🦄 开源社区系统:基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供详细的开发文档和配套教程。包含帖子、评论、私信、系统通知、点赞、关注、搜索、用户设置、数据统计等模块。

Echo — 开源社区系统 项目上线到服务器之后可能会出现各种各样的 BUG,比如 Elasticsearch 服务启动失败导致搜索模块不可用,但是在本地运行是完全没问题的,所以各位小伙伴可以放心下载部署。 📚 项目简介 Echo 是一套前后端不分离的开源社区系统,基于目前主流 Java Web

Jan 7, 2023

(周瑜)Java - SpringBoot 持久化 WebShell

工具仅用于安全研究,禁止使用工具发起非法攻击,造成的后果使用者负责 ZhouYu - 周瑜 Java - SpringBoot 持久化 WebShell 背景:后Spring时代,SpringBoot jar部署模式下,一般没有了JSP,所有的模板都在jar内,当大家都热衷于内存马的时候,发现很容

Dec 22, 2022

backend for a sharing app using SpringBoot, Redis, MySQL, and AWS S3.

backend for a sharing app using SpringBoot, Redis, MySQL, and AWS S3.

moments_v2_backend (Work In Progress) backend for a sharing app using SpringBoot, Redis, MySQL, and AWS S3. This is the second version of my project S

Dec 26, 2022

Hcode Online Judge(HOJ):An open source online judge system base on SpringBoot, Springcloud Alibaba and Vue.js !

Hcode Online Judge(HOJ):An open source online judge system base on SpringBoot, Springcloud Alibaba and Vue.js !

Hcode Online Judge(HOJ) 前言 基于前后端分离,分布式架构的在线测评平台(hoj),前端使用vue,后端主要使用springboot,redis,mysql,nacos等技术。 在线Demo:https://hdoi.cn 在线文档:https://www.hcode.top/

Dec 31, 2022

Dynamic Configuration Capability for SpringBoot Application

Dynamic Configuration Capability for SpringBoot Application

Spring Boot Dynamic Config Hot-reload your SpringBoot configurations, with just a '@DynamicConfig' annotation, the simplest solution, ever. English 简体

Jan 3, 2023

⭐⭐⭐SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统

⭐⭐⭐SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统

分布式高并发商品秒杀系统 介绍 快速启动 TODO 压测结果 Q&A 介绍 本项目为另一个项目dis-seckill的压力测试版本,重点工作为优化秒杀接口性能,提高单机系统并发瓶颈。 完整项目dis-seckill扩展包括 项目基础技术点和流程图介绍; 接口安全优化; 系统限流与降级服务; Ngin

Sep 2, 2022

⭐⭐⭐⭐SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统

⭐⭐⭐⭐SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统

分布式高并发商品秒杀系统 介绍 快速启动 项目架构图 项目入门 TODO Q&A 参考资料 介绍 本项目是在dis-seckill上改进,项目名含义为分布式秒杀系统。采用微服务思想,意在提高秒杀系统的整体性能。 改进点: 优化秒杀流程,提高单机系统性能瓶颈。dis-seckill-test 接口安全

Jan 2, 2023
Owner
yemingfeng
yemingfeng
SpringBoot SpringSecurity Jpa mybatis-plus websocket Redis camunda Vue3 Vite ant-design VbenAdmin vxe-table bpmn.js

SpringBoot SpringSecurity Jpa mybatis-plus websocket Redis camunda Vue3 Vite ant-design VbenAdmin vxe-table bpmn.js

zsvg 16 Dec 13, 2022
基于SpringCloud2.1的微服务开发脚手架,整合了spring-security-oauth2、nacos、feign、sentinel、springcloud-gateway等。服务治理方面引入elasticsearch、skywalking、springboot-admin、zipkin等,让项目开发快速进入业务开发,而不需过多时间花费在架构搭建上。持续更新中

快速开始 先决条件 首先本机先要安装以下环境,建议先学习了解springboot和springcloud基础知识。 git java8 maven 开发环境搭建 linux和mac下可在项目根目录下执行 ./install.sh 快速搭建开发环境。如要了解具体的步骤,请看如下文档。 具体步骤如下:

zhoutaoo 7.9k Jan 6, 2023
lamp-cloud 基于SpringCloud(Hoxton.SR10) + SpringBoot(2.3.9.RELEASE) 的微服务快速开发平台,其中的可配置的SaaS功能尤其闪耀, 具备RBAC功能、网关统一鉴权、Xss防跨站攻击、自动代码生成、多种存储系统、分布式事务、分布式定时任务等多个模块,支持多业务系统并行开发, 支持多服务并行开发,可以作为后端服务的开发脚手架。代码简洁,注释齐全,架构清晰,非常适合学习和企业作为基础框架使用。

《灯灯》中后台快速开发平台 lamp 项目名字由来 叙事版: 在一个夜黑风高的晚上,小孩吵着要出去玩,于是和程序员老婆一起带小孩出去放风,路上顺便讨论起项目要换个什么名字,在各自想出的名字都被对方一一否决后,大家陷入了沉思。 走着走着,在一盏路灯下,孩砸盯着路灯打破宁静,喊出:灯灯~ 我和媳妇愣了一

最后 4.7k Jan 5, 2023
dynamic datasource for springboot 多数据源 动态数据源 主从分离 读写分离 分布式事务

一个基于springboot的快速集成多数据源的启动器 简介 dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。 其支持 Jdk 1.7+, SpringBoot 1.4.x 1.5.x 2.x.x。 文档 | D

baomidou 3.8k Dec 31, 2022
SpringBoot 基础教程 | 从入门到上瘾 | 基于2.0.0.M5制作

推荐阅读本教程的三大理由: 文章内容均为原创,结合官方文档和实战经验编写。 文章结构经过细致整理,对新人学习更加友好。 精选常用技术,不求全面,但求精华!! SpringBoot 源码精读 图文教程 源码下载:《SpringBoot 基础教程-Git 》 — Hey Man,Don't forget

一只袜子 2.5k Dec 29, 2022
springboot SSO 单点登录,OAuth2实现,支持App登录,支持分布式

smart-sso QQ交流群:454343484 ?? 、769134727 简述 smart-sso使用当下最流行的SpringBoot技术,基于OAuth2认证授权协议,为您构建一个易理解、高可用、高扩展性的分布式单点登录应用基层。 相关文档 smart-sso单点登录(一):简介 smart

Joe 1.9k Dec 31, 2022
一个能够获取随机图片的 Api,使用 SpringBoot 构建

Random-Image-Api Random-Image-Api 一个能够获取随机图片的 Api,基于 Spring Boot 构建 可读取本地图片列表的地址,并提供随机访问服务,可配置域名白名单访问 项目说明 程序启动的时候会自动加载 项目路径/list 文件夹下的所有列表文件; 图片列表文件:

陈亚伟 1.3k Dec 21, 2022
SpringBoot 脚手架,简化项目构建

EasyRiggerInitializr | SpringBoot 脚手架,简化项目构建 作者: 小傅哥,Java Developer, ✏️ 虫洞 · 科技栈,作者, ?? CSDN 博客专家 本代码库是作者小傅哥多年从事一线互联网Java开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教

小傅哥 81 Nov 20, 2022
Java 项目快速开发脚手架。核心技术采用 SpringBoot、MyBatis、Thymeleaf、Bootstrap。

前言 闲来无事,整一个 Java 项目快速开发脚手架。 正文 一、简介 Chewing 是一个简单的 Java 项目快速开发脚手架。既适合需要开发小型项目的小伙伴使用,也适合刚入门的新手用来学习一些常用的技术。 二、源码 Github:https://github.com/jingqueyimu/c

null 33 Sep 26, 2022