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
,在那里可以找到我,里面也有更多的优秀文章
相关文章:
tio-websocket-spring-boot-starter的最简单实例,看完你一定有所收获
前言 我最近一个月一直在寻找能够快速开发实时通讯的简单好用的模块,所以我就去寻找了一下相关的内容.在此之前我使用的是Spring原生的webSocket,她有个弊端就是设置组不容易设置,而且配置上也稍微复杂一点,需要配置拦截器和处理器,还需要把它放入到Springboot的启动容器里面,也…...
列出连通集
输入样例: 8 6 0 7 0 1 2 0 4 1 2 4 3 5 输出样例: { 0 1 4 2 7 } { 3 5 } { 6 } { 0 1 2 7 4 } { 3 5 } { 6 } solution #include <stdio.h> #include <string.h> int arcs[10][10]; int visited[10] {0}; void DFS(int n, int v); void BFS(int n , int i)…...
前端 富文本编辑器原理——从javascript、html、css开始入门
文章目录 ⭐前言⭐html的contenteditable属性💖 输入的光标位置(浏览器获取selection)⭐使用Selection.toString () 返回指定的文本⭐getRangeAt 获取指定索引范围 💖 修改光标位置💖 设置选取range ⭐总结⭐结束 ⭐前…...
堆--数据流中第K大元素
如果对于堆不是太认识,请点击:堆的初步认识-CSDN博客 数据流与上述堆--数组中第K大元素-CSDN博客的数组区别: 数据流的数据是动态变化的,数组是写死的 堆--数组中第K大元素-CSDN博客题的小顶堆加一个方法: class MinH…...
【算法|动态规划No.12】leetcode152. 乘积最大子数组
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…...
Covert Communication 与选择波束(毫米波,大规模MIMO,可重构全息表面)
Covert Communication for Spatially Sparse mmWave Massive MIMO Channels 2023 TOC abstract 隐蔽通信,也称为低检测概率通信,旨在为合法用户提供可靠的通信,并防止任何其他用户检测到合法通信的发生。出于下一代通信系统安全链路的强烈…...
计算机毕业设计 基于协调过滤算法的绿色食品推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
华为云云耀云服务器L实例评测|部署在线影音媒体系统 Jellyfin
华为云云耀云服务器L实例评测|部署在线影音媒体系统 Jellyfin 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品规格1.3 应用场景1.4 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Jellyfin3.1 Jellyfin 介绍3.2 Docke…...
GhostNet原理解析及pytorch实现
论文:https://arxiv.org/abs/1911.11907 源码:https://github.com/huawei-noah/ghostnet 简要论述GhostNet的核心内容。 Ghost Net 1、Introduction 在训练良好的深度神经网络的特征图中,丰富甚至冗余的信息通常保证了对输入数据的全面理…...
视频二维码的制作方法,支持内容修改编辑
现在学生经常会需要使用音视频二维码,比如外出打开、才艺展示、课文背诵等等。那么如何制作一个可以长期使用的二维码呢?下面来给大家分享一个二维码制作(免费在线二维码生成器-二维码在线制作-音视频二维码在线生成工具-机智熊二维码&#x…...
清华GLM部署记录
环境部署 首先安装anaconda(建议包管理比较方便)windows用户需手动配置一下环境变量,下面默认是在ubuntu环境说明创建python环境,conda create -n your_env_name python3.10 (注:官方是提供是python3.8,但…...
贪心算法+练习
正值国庆之际,祝愿祖国繁荣昌盛,祝愿朋友一生平安!终身学习,奋斗不息! 目录 1.贪心算法简介 2.贪心算法的特点 3.如何学习贪心算法 题目练习(持续更新) 1.柠檬水找零(easy&…...
使用华为eNSP组网试验⑷-OSPF多区域组网
今天进行了OSPF的多区域组网试验,本来这是个很简单的操作,折腾了好长时间,根本原因只是看了别人写的配置代码,没有真正弄明白里面对应的规则。 一般情况下,很多单位都使用OSPF进行多区域的组网,大体分为1个…...
P1843 奶牛晒衣服 【贪心】
P1843 奶牛晒衣服 【贪心】 题目背景 熊大妈决定给每个牛宝宝都穿上可爱的婴儿装 。但是由于衣服很湿,为牛宝宝晒衣服就成了很不爽的事情。于是,熊大妈请你(奶牛)帮助她完成这个重任。 题目描述 一件衣服在自然条件下用一秒的时间…...
91、Redis - 事务 与 订阅-发布 相关的命令 及 演示
★ 事务相关的命令 Redis事务保证事务内的多条命令会按顺序作为整体执行,其他客户端发出的请求绝不可能被插入到事务处理的中间, 这样可以保证事务内所有命令作为一个隔离操作被执行。 Redis事务同样具有原子性,事务内所有命令要么全部被执…...
GPU如何成为AI的加速器
0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。 本文关键词:GPU、深度学习、GP…...
Map声明、元素访问及遍历、⼯⼚模式、实现 Set - GO语言从入门到实战
Map声明、元素访问及遍历 - GO语言从入门到实战 Map 声明的方式 m := map[string]int{"one": 1, "two": 2, "three": 3} //m初始化时就已经设置了3个键值对,所以它的初始长度len(m)是3。m1 := map[string]int{} //m1被初始化为一个空的m…...
机器人中的数值优化|【七】线性搜索牛顿共轭梯度法、可信域牛顿共轭梯度法
机器人中的数值优化|【七】线性搜索牛顿共轭梯度法、可信域牛顿共轭梯度法 Line Search Newton-CG, Trust Region Newton-CG 往期回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbro…...
websocket实现go(server)与c#(client)通讯
go 服务端 使用到github.com/gorilla/websocket package mainimport ("fmt""github.com/gorilla/websocket""log""net/http" )func main() {var upgrader websocket.Upgrader{ReadBufferSize: 1024,WriteBufferSize: 1024,CheckOr…...
洛谷题目题解详细解答
洛谷是一个很不错的刷题软件,可是找不到合适的题解是个大麻烦,大家有啥可以私信问我,以下是我已经通过的题目。 你如果有哪一题不会(最好是我通过过的,我没过的也没关系),可以私信我࿰…...
【C语言】八大排序算法
文章目录 一、冒泡排序1、定义2、思想及图解3、代码 二、快速排序1、hoare版本2、挖坑法3、前后指针法4、非递归快排5、快速排序优化1)三数取中选key值2)小区间优化 三、直接插入排序1、定义2、代码 四、希尔排序1、定义2、图解3、代码 五、选择排序1、排…...
2023年中国智能电视柜产量、需求量、市场规模及行业价格走势[图]
电视柜是随着电视机的发展和普及而演变出的家具种类,其主要作用是承载电视机,又称视听柜,随着生活水平的提高,与电视机相配套的电器设备也成为电视柜的收纳对象。 随着智能家具的发展,智能电视机柜的造型和风格都是有了…...
docker容器使用初体验
我们写程序时,都会搭建相关的环境,比如写了一个web,使用了tomcat、nginx等,现在想要把程序部署到云服务器或者在其他电脑上运行,就需要重新部署一遍环境,尤其是项目开源后,上手成本大。 docker…...
React Hooks ——性能优化Hooks
什么是Hooks Hooks从语法上来说是一些函数。这些函数可以用于在函数组件中引入状态管理和生命周期方法。 React Hooks的优点 简洁 从语法上来说,写的代码少了上手非常简单 基于函数式编程理念,只需要掌握一些JavaScript基础知识与生命周期相关的知识不…...
C#学习系列相关之多线程(一)----常用多线程方法总结
一、多线程的用途 在介绍多线程的方法之前首先应当知道什么是多线程, 在一个进程内部可以执行多个任务,而这每一个任务我们就可以看成是一个线程。是程序使用CPU的基本单位。进程是拥有资源的基本单位, 线程是CPU调度的基本单位。多线程的作用…...
Vscode爆红Delete `␍`eslintprettier/prettier
一、先看报错 文件中爆红,提示 Delete ␍eslintprettier/prettier 二、解决方案 项目根目录下,.prettierrc.js 文件中: endOfLine: auto,三、重启VsCode 此时不在爆红,问题完美解决...
Mac安装Ecplise产品报错:dose not contain the JNI_CreateJavaVM symbol
1. 絮絮叨叨 工作中需要借助Ecplise Memory Analyzer (MAT)分析dump文件,直接下载、安装、运行MAT报错 询问同事后,同事说可以先安装Ecplise,再以插件的形式安装MAT下载、安装好Eclipse,点击运行仍然报错,且错误信息一…...
如何使用大语言模型来绘制图画
请创作一张科技感十足的图片,包含siri和iphone两个元素,请帮我挑选合适的style和background 好的,我会为你创作一张科技感十足的图片,包含siri和iphone两个元素。我会根据你的要求,选择一种适合的风格和背景。请稍等一…...
代码随想录算法训练营第23期day11 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项 、150. 逆波兰表达式求值
目录 一、(leetcode 20)有效的括号 二、(leetcode 1047)删除字符串中的所有相邻重复项 用栈存放 将字符串直接当成栈 三、(leetcode 150)逆波兰表达式求值 一、(leetcode 20)…...
数据结构-优先级队列(堆)
文章目录 目录 文章目录 前言 一 . 堆 二 . 堆的创建(以大根堆为例) 堆的向下调整(重难点) 堆的创建 堆的删除 向上调整 堆的插入 三 . 优先级队列 总结 前言 大家好,今天给大家讲解一下堆这个数据结构和它的实现 - 优先级队列 一 . 堆 堆(Heap࿰…...
网站建设昆明包装设计/seo计费怎么刷关键词的
注意MSVCPRT.lib 和 MSVCPRTD.lib 是静态库,不要有任何动态链接库 (Dll) 直接与它们。这些库分别是还取决于 MSVCRT.lib 和 MSVCRTD.lib。如果您拥有的任何应用程序使用 MSVCPRT.lib 或 MSVCPRTD.lib,并使用"忽略默认库"(/NOD或 NO…...
公司建网站有何意义/深圳百度快速排名提升
题目:将1-9这9个数字分成三个百位数,每个数字只能用一次。要求:第二个数字是第一个数的2倍,第三个数字是第一个的3倍。 输出所有可能的情况。思路:用三层循环,第一位是百位数,第二位是十位数&am…...
个人做网站好吗/疫情最新数据消息地图
今天我们做一个显示HelloWorld的简单小程序创建HelloWorld.cpp文件,代码如下: #include <QApplication> #include <QLabel>int main(int argc,char **argv) {QApplication app(argc,argv);QLabel label("Hello World!");label.set…...
营销型网站托管/百度提问首页
项目管理有五大过程组,十大知识领域,42个过程。其中42个过程记忆起来比较抽象,下面我们通过一个完整的项目管理,来分解下各个过程组的过程执行顺序,能帮助大家理解,有助于记忆的加深。一、启动过程组1、制…...
工程信息造价/南京seo外包平台
1、RunWith RunWith就是一个运行器 RunWith(JUnit4.class)就是指用JUnit4来运行 RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境 RunWith(Suite.class)的话就是一套测试集合, RunWith(SpringJUnit4ClassRunner.class)使用了Spring的SpringJU…...
企业官网型网站模板/最近新闻热点事件
●CPU中(1)不仅要保证指令的正确执行,还要能够处理异常事件。 (1)A.运算器 B.控制器 C.寄存器组 D.内部总线 ●构成运算器的部件中,为运算提供数据并暂时保存结果的是(2)。 (2)A.数据总线 B.累加器 C.运算逻辑单元 D.状态寄存器 ●在计算机系统中,(3)是指在CPU执…...