当前位置: 首页 > news >正文

tio-websocket-spring-boot-starter的最简单实例,看完你一定有所收获

前言

我最近一个月一直在寻找能够快速开发实时通讯的简单好用的模块,所以我就去寻找了一下相关的内容.在此之前我使用的是Spring原生的webSocket,她有个弊端就是设置组不容易设置,而且配置上也稍微复杂一点,需要配置拦截器和处理器,还需要把它放入到Springboot的启动容器里面,也有个好处就是,服务端口是单服务的,而且定制性强,就是很多东西都需要自己来主动配置,让我头疼的就是的配置
在此之后我就去找寻能让我写的代码最少,而且还易用的服务,就发现了TIO,下面先看一下简介

TIO

极致打磨的底层集群能力,可无缝解决IM、物联网等大型产品的集群需求
易学易用,让刚毕业的大学生也能轻易驾驭
全方位开箱即用的监控能力
实战中仍表现出卓越的性能,不用实验室数据忽悠智慧的大众
内置协议适配能力,让多协议接入不再难
内置ack消息能力,让RPC等场景轻松实现
自创同步锁、同步安全线程池、同步数据结构等工具库,为业务应用提供丰富的开箱即用API
内置半包粘包处理
丰富的生态,目前已经用t-io实现了http、websocket、mqtt及大量私有协议
内置慢攻击防御机制,帮助应用自动拉黑嫌疑IP

看了上面的话,大概意思就是,简单易学,而且是国人开发的,内部有自动处理半包和粘包处理机制,无需再重新处理粘包,接下来就是Tio的具体配置代码

正文

但是今天我们要用的并不是tio-websocket-server而是另外一个更加简单的服务,不过这个已经在2020年停止更新了,好像是最后一版java1.8版本的,我看了Tio最新版都是用java17的了,如果还在用java1.8的兄弟们可以使用这个依赖tio-websocket-spring-boot-starter,下面是依赖的完整展示

1.POM导入依赖

 <!--t-io依赖--><dependency><groupId>org.t-io</groupId><artifactId>tio-websocket-spring-boot-starter</artifactId><version>3.6.0.v20200315-RELEASE</version></dependency>

2.YML配置文件中放入以下配置

# Tio 配置信息
tio:websocket:server:port: 9876#心跳超时时间heartbeat-timeout: 60000#是否支持集群,集群开启需要rediscluster:enabled: falseredis:ip: localhostport: 6379

3.启动类加入注解

注解:@EnableTioWebSocketServer

4.创建处理器
package com.xssq.handler;import com.xssq.service.ApiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.tio.core.ChannelContext;
import org.tio.core.Tio;
import org.tio.http.common.HttpRequest;
import org.tio.http.common.HttpResponse;
import org.tio.websocket.common.WsRequest;
import org.tio.websocket.server.handler.IWsMsgHandler;/**
* tio网络套接字味精处理程序
*
* @author xssq
* @version 1.0.0
* @date 2023/09/26
* @wisdom 你可以不会,但你不能不知道
*/
@Component
public class TioWebSocketMsgHandler implements IWsMsgHandler {@Autowiredprivate ApiService apiService;/*** 握手** @param httpRequest    http请求* @param httpResponse   http响应* @param channelContext 渠道上下文* @return {@link HttpResponse}*/@Overridepublic HttpResponse handshake(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) {String token = httpRequest.getParam("token");channelContext.setToken(token);Tio.bindGroup(channelContext, "1");Tio.bindUser(channelContext, "1");System.out.println("handshake握手方法");return httpResponse;}/*** 握手后打开** @param httpRequest    http请求* @param httpResponse   http响应* @param channelContext 渠道上下文*/@Overridepublic void onAfterHandshaked(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) {System.out.println("onAfterHandshaked握手后打开的");}/*** 在字节上** @param wsRequest      ws请求* @param bytes          字节* @param channelContext 渠道上下文* @return {@link Object}*/@Overridepublic Object onBytes(WsRequest wsRequest, byte[] bytes, ChannelContext channelContext) {System.out.println("onBytes方法");return null;}/*** 关闭** @param wsRequest      ws请求* @param bytes          字节* @param channelContext 渠道上下文* @return {@link Object}*/@Overridepublic Object onClose(WsRequest wsRequest, byte[] bytes, ChannelContext channelContext) {System.out.println("onClose关闭方法");return null;}/*** 在文本上** @param wsRequest      ws请求* @param channelContext 渠道上下文* @param message        信息* @return {@link Object}*/@Overridepublic Object onText(WsRequest wsRequest, String message, ChannelContext channelContext) {if ("心跳包".equals(message)) {return null;}apiService.sendMsg(channelContext, message);return null;}
}

5.创建监听器

package com.xssq.listener;import org.springframework.stereotype.Component;
import org.tio.core.ChannelContext;
import org.tio.core.intf.GroupListener;/**
* spring boot组侦听器
*
* @author xssq
* @version 1.0.0
* @date 2023/10/05
* @wisdom 你可以不会,但你不能不知道
*/
@Component
public class SpringBootGroupListener implements GroupListener {/*** 绑定后打开** @param channelContext 信道上下文* @param s              s*/@Overridepublic void onAfterBind(ChannelContext channelContext, String s) {System.out.println("绑定后打开");}/*** 在解除绑定后打开** @param channelContext 信道上下文* @param s              s*/@Overridepublic void onAfterUnbind(ChannelContext channelContext, String s) {System.out.println("在解除绑定后打开");}
}

6.到此整个教程也就结束了,其实那个监听器也可以不要,不过用于方便绑定组下面是一些绑定组的语法

/*绑定组*/
Tio.bindGroup(channelContext, "1");
/*绑定userId*/
Tio.bindUser(channelContext, "1");
......
...

其实还有很多绑定的,还有绑定业务方法,绑定token的,很多,下面是一些服务说明

//最主要的逻辑处理类,必须要写,否则 抛异常
public class MyWebSocketMsgHandler  implements IWsMsgHandler {}
//可不写
public class SpringBootAioListener extends WsServerAioListener {}
//可不写
public class SpringBootGroupListener implements GroupListener {}
//可不写
public class SpringBootIpStatListener implements IpStatListener {}

后记

操作完上面的内容就可以正常使用了,感谢大家观看

如果我的博客帮助到了您,您可以到我的博客https://blog.csdn.net/weixin_57228276或者微信公众号搜索幸识SQ,在那里可以找到我,里面也有更多的优秀文章

http://www.lryc.cn/news/182881.html

相关文章:

  • 列出连通集
  • 前端 富文本编辑器原理——从javascript、html、css开始入门
  • 堆--数据流中第K大元素
  • 【算法|动态规划No.12】leetcode152. 乘积最大子数组
  • Covert Communication 与选择波束(毫米波,大规模MIMO,可重构全息表面)
  • 计算机毕业设计 基于协调过滤算法的绿色食品推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 华为云云耀云服务器L实例评测|部署在线影音媒体系统 Jellyfin
  • GhostNet原理解析及pytorch实现
  • 视频二维码的制作方法,支持内容修改编辑
  • 清华GLM部署记录
  • 贪心算法+练习
  • 使用华为eNSP组网试验⑷-OSPF多区域组网
  • P1843 奶牛晒衣服 【贪心】
  • 91、Redis - 事务 与 订阅-发布 相关的命令 及 演示
  • GPU如何成为AI的加速器
  • Map声明、元素访问及遍历、⼯⼚模式、实现 Set - GO语言从入门到实战
  • 机器人中的数值优化|【七】线性搜索牛顿共轭梯度法、可信域牛顿共轭梯度法
  • websocket实现go(server)与c#(client)通讯
  • 洛谷题目题解详细解答
  • 【C语言】八大排序算法
  • 2023年中国智能电视柜产量、需求量、市场规模及行业价格走势[图]
  • docker容器使用初体验
  • React Hooks ——性能优化Hooks
  • C#学习系列相关之多线程(一)----常用多线程方法总结
  • Vscode爆红Delete `␍`eslintprettier/prettier
  • Mac安装Ecplise产品报错:dose not contain the JNI_CreateJavaVM symbol
  • 如何使用大语言模型来绘制图画
  • 代码随想录算法训练营第23期day11 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项 、150. 逆波兰表达式求值
  • 数据结构-优先级队列(堆)
  • C++11新特性(语法糖,新容器)