1. 整体思路
群组聊天功能实现思路
- 需要为每个群组维护一个对应的集合(可以是
Set
等数据结构),用来存放该群组内所有在线用户的WebSocketSession
。当有消息发送到群组时,遍历该群组对应的集合,向其中的每个在线用户发送消息。 - 在消息结构体中新增一个字段用于标识所属群组,以便后端根据这个字段来进行消息的广播分发。
离线用户处理及历史消息推送思路
- 对于离线用户,当他们重新上线时,需要能够识别出他们之前所在的群组(可以通过用户登录等操作记录其关联群组信息)。
- 后端要将该群组在其离线期间产生的历史消息查询出来(这可能涉及到数据库操作,将群组聊天消息存储到数据库中以便查询历史记录),然后通过
WebSocket
连接将这些历史消息逐一发送给重新上线的用户。
后端代码修改思路
1. 群组管理与消息处理
- 群组数据结构:使用合适的数据结构(如
Map
)来存储群组相关信息,以群组 ID 作为键,对应的值可以是包含该群组内在线用户WebSocketSession
列表以及群组历史消息列表等信息的对象。 - 消息格式定义:明确消息的格式,使其能区分是文字消息还是图片消息,并且包含必要的元数据,比如发送者、群组 ID、消息内容(文字内容或图片链接等)、时间戳等。
- 消息分发逻辑:当接收到消息时,根据消息中的群组 ID,找到对应的群组在线用户列表,然后将消息发送给这些用户。
2. 离线用户历史消息处理
- 用户与群组关联记录:维护用户与所属群组的关联关系,比如使用
Map
存储用户 ID 和其所属群组 ID 列表的对应关系,以便在用户重新上线时确定需要推送哪些群组的历史消息。 - 历史消息存储与查询:将群组内的聊天消息持久化存储(实际应用中通常是存入数据库,这里可简单模拟存储结构),当离线用户重新上线时,从存储结构中查询出其所属群组的历史消息并推送给他。
直接 springboot+websokcet,感觉比原生的websocket简单一点。
- 集成websokcet
- 配置文件
- handler
- postman测试一下
- uniapp
pom添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
application.yml中 端口配置(先复用应用的端口吧)
server:
port: 7877
tomcat:
accept-count: 10000
threads:
max: 800
min-spare: 200
compression:
enabled: true
servlet:
context-path: /chat
配置文件(application.yml)
- 务器端口及相关配置:
server.port
配置为7877
,指定了 Spring Boot 应用启动后监听的端口号。server.tomcat.accept-count
设置为10000
,它表示当所有的处理线程都在使用时,能够放到处理队列中的连接请求数量。server.tomcat.threads.max
设为800
定义了最大线程数,min-spare
设为200
则是最小备用线程数,这些配置用于优化 Tomcat 处理请求的线程资源分配。server.compression.enabled
设为true
,开启了服务器响应内容的压缩功能,有助于减少网络传输的数据量,提高性能。server.servlet.context-path
配置为/chat
,意味着应用的上下文路径是/chat
,后续访问应用中的资源路径都是基于这个上下文路径来构建的。
WebSocket 配置类(WebSocketConfig)
- 这个类实现了
WebSocketConfigurer
接口,用于配置 WebSocket 相关的处理。 - 在
registerWebSocketHandlers
方法中,将自定义的MyWebSocketHandler
注册到了 WebSocket 处理器注册表WebSocketHandlerRegistry
中,并且将 WebSocket 的端点路径设置为/websocket
,同时允许来自任意源(setAllowedOrigins("*")
)的连接访问该 WebSocket 端点。
package com.edwin.java.config;
import com.edwin.java.config.interceptor.GroupChatInterceptor;
import com.edwin.java.util.MyWebSocketHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
/**
* registerWebSocketHandlers 是一个函数或方法,通常用于在 Web 应用程序中注册 WebSocket 处理程序。
* WebSocket 是一种基于 TCP 的协议,可以实现客户端和服务器之间的双向通信,可以用于实时应用程序,如聊天应用、游戏、实时更新等。在 Java Web 应用程序中,可以使用 Spring 框架提供的 WebSocket 支持来处理 WebSocket 连接。
* registerWebSocketHandlers 方法是 Spring WebSocket 的一个 API,它允许开发人员在应用程序中注册 WebSocket 处理程序,并将其映射到特定的 U