欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > Tio-Boot 集成 Spring Boot 实现即时通讯功能全解析

Tio-Boot 集成 Spring Boot 实现即时通讯功能全解析

2025/2/24 22:34:13 来源:https://blog.csdn.net/m0_68856746/article/details/145791250  浏览:    关键词:Tio-Boot 集成 Spring Boot 实现即时通讯功能全解析

Tio-Boot 集成 Spring Boot 实现即时通讯功能全解析(详细版)

一、Tio-Boot 简介

Tio-Boot 是基于 Tio 框架的 Spring Boot Starter 扩展,提供高性能、低延迟的网络通信能力,支持 TCP/UDP 协议及 WebSocket 协议,适用于即时通讯、物联网等场景。其核心优势包括:

  • 高性能:基于 Java NIO 实现非阻塞通信
  • 易扩展:支持自定义协议和集群扩展
  • 简化配置:通过自动配置减少冗余代码

二、项目启动配置

1. 添加依赖

pom.xml 中引入 Tio-Boot 依赖(版本 3.6.0.v20200315-RELEASE):

<dependencies><dependency><groupId>org.tio</groupId><artifactId>tio-core-spring-boot-starter</artifactId><version>3.6.0.v20200315-RELEASE</version></dependency><dependency><groupId>org.tio</groupId><artifactId>tio-websocket-spring-boot-starter</artifactId><version>3.6.0.v20200315-RELEASE</version></dependency>
</dependencies>

2. 配置文件 application.yml

server:port: 8080tio:websocket:server:ip: 127.0.0.1heartbeat-timeout: 600000

3. 启动类配置

在 Spring Boot 主类添加 @EnableTioWebSocketServer 注解:

@SpringBootApplication
@EnableTioWebSocketServer
public class TioChatApplication {public static void main(String[] args) {SpringApplication.run(TioChatApplication.class, args);}
}
@Configuration
public class TioManualConfig {@Value("${tio.websocket.server.port:9326}")private int websocketPort;@Bean(initMethod = "start")public WsServerStarter wsServerStarter() throws IOException {return new WsServerStarter(websocketPort, new TioWebSocket());}
}

三、核心功能实现

1. 消息处理器(Handler)

创建 ChatServerAioHandler 处理消息收发:

@Component
@TioWebSocketMsgHandler
public class ChatServerAioHandler implements IWsMsgHandler {private static final String CHARSET = "UTF-8";@Overridepublic HttpResponse handshake(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) {String userId = httpRequest.getParam("uid");if (StrUtil.isBlank(userId)) {httpResponse.setStatus(HttpResponseStatus.C401);return httpResponse;}// 绑定用户到默认群组Tio.bindGroup(channelContext, "default_group");Tio.bindUser(channelContext, userId);return httpResponse;}@Overridepublic void onAfterHandshaked(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) {System.out.println("用户 " + channelContext.getToken() + " 已连接");}@Overridepublic Object onText(WsRequest wsRequest, String message, ChannelContext channelContext) {System.out.println("收到消息: " + message);JSONObject json = JSON.parseObject(message);String type = json.getString("type");String content = json.getString("content");String target = json.getString("target");if ("private".equals(type)) {// 私聊逻辑ChannelContext targetContext = Tio.getChannelContextByToken(channelContext.getGroupContext(), target);if (targetContext != null) {Tio.send(targetContext, content.getBytes(CHARSET));}} else if ("group".equals(type)) {// 群聊逻辑Tio.sendToGroup(channelContext, "default_group", content.getBytes(CHARSET));} else if ("group_custom".equals(type)) {// 组聊逻辑(自定义群组)String groupId = json.getString("groupId");Tio.sendToGroup(channelContext, groupId, content.getBytes(CHARSET));}return null;}@Overridepublic void onClose(WsRequest wsRequest, byte[] bytes, ChannelContext channelContext) {String userId = Tio.getUserContext(channelContext).getToken();System.out.println("用户 " + userId + " 已断开");Tio.unbindUser(channelContext, userId);Tio.unbindGroup(channelContext, "default_group");}
}

2. 用户与群组管理

@Component
public class UserService {private static final Map<String, ChannelContext> USER_MAP = new ConcurrentHashMap<>();public void bindUser(ChannelContext channelContext, String userId) {USER_MAP.put(userId, channelContext);}public void unbindUser(String userId) {ChannelContext context = USER_MAP.remove(userId);if (context != null) {Tio.close(context);}}public ChannelContext getUserContext(String userId) {return USER_MAP.get(userId);}
}

3. 组聊扩展(高级功能)

@Component
public class GroupService {private static final Map<String, Set<ChannelContext>> GROUP_MAP = new ConcurrentHashMap<>();public void joinGroup(ChannelContext context, String groupId) {GROUP_MAP.computeIfAbsent(groupId, k -> ConcurrentHashMap.newKeySet()).add(context);}public void leaveGroup(ChannelContext context, String groupId) {GROUP_MAP.getOrDefault(groupId, Collections.emptySet()).remove(context);}public void sendToGroup(String groupId, byte[] message) {GROUP_MAP.getOrDefault(groupId, Collections.emptySet()).forEach(ctx -> {try {ctx.writeAndFlush(new String(message, CHARSET));} catch (Exception e) {e.printStackTrace();}});}
}

四、测试与验证

1. 启动服务

运行 TioChatApplication,控制台输出:

TioWebSocketServer 启动成功,监听端口:8081

2. 客户端连接

使用 WebSocket 客户端连接 ws://localhost:8081,发送测试消息:

{"type": "private","target": "user123","content": "Hello Tio!"
}

3. 验证功能

  • 私聊:指定 typeprivatetarget 为目标用户 ID
  • 群聊:发送消息时指定 typegroup
  • 组聊:发送消息时指定 typegroup_custom 并携带 groupId 字段

Tio可以更好的拓展websocket,更方便的实现私聊,组聊和群聊的功能,其内部封装好了许多方法,详细可以查看官方文档

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词