让网络编程更轻松和有趣 t-io
原文:https://www.oschina.net/p/t-io
注意:还是尽量去看原文,因为原文下面的评论也很有意思,可以参考大牛的讨论学习到新的东西
t-io: 让天下没有难开发的网络编程
旧时王谢堂前燕,飞入寻常百姓家----当年那些王谢贵族们才拥有的"百万级即时通讯"应用,将因为t-io的诞生,纷纷飞入普通人家的屋檐下。
t-io是啥
大家口中的t-io一般是指tio-core,它是基于java aio的网络编程框架,和netty属于同类
基于tio-core来开发IM、TCP私有协议、RPC、游戏服务器端、推送服务、实时监控、物联网将会变得空前的简单。
t-io家族除了tio-core外,还有tio-websocket-server、tio-http-server、tio-webpack-core、tio-flash-policy-server等,后面所列都是基于tio-core开发的应用层组件
列一下t-io家族成员:
tio-core:基于java aio的网络编程框架。使用示例:tio-showcase
tio-websocket-server:基于tio-core开发的websocket服务器。使用示例:tio-websocket-showcase
tio-http-server:基于tio-core开发的http服务器。使用示例:tio-http-server-showcase
tio-webpack-core:基于tio-core开发的js/css/html编译压缩工具,代码已经开源,但尚无使用文档和示例,暂时属于内用阶段,使用案例:http://www.nb350.com
tio-flash-policy-server:基于tio-core开发的flash-policy-server,代码已经开源,但尚无使用文档和示例
列一下tio-core应用场景的一些案例
IM:j-im
游戏服务器端:贝密游戏
推送服务:牛吧云播
物联网:氦氪云
TCP私有协议:这个太多了,直接看案例列表吧
tio-core提供了哪些功能
内置对半包和粘包的处理:源码分析见:https://my.oschina.net/talenttan/blog/1610690
ChannelContext资源维护:会话资源维护是个工程量大,复杂度高的活,尤其是涉及到各种资源绑定、解绑、遍历时,极易出错和OOM,不过这些复杂的事件tio-core全部给你做好了,除非你要自己额外去绑定资源
心跳检测(防止不良客户端占着TCP连接无所事事)
心跳发送(client)
断链重连(client)
流量监控统计,既提供单条ChannelContext流量统计,又提供所有ChannelContext流量统计,下面所列为部分监控数据,详情请见:ChannelStat.java和GroupStat.java
已接收的字节数
已接收了多少次TCP数据包
已接收的packet数
已处理的字节数
已处理的packet数
处理消息包耗时,单位:毫秒。拿这个值除以handledPackets,就是处理每个消息包的平均耗时
已发送的字节数
已发送的packet数
最近一次收到业务消息包的时间(一个完整的业务消息包,一部分消息不算)
最近一次发送业务消息包的时间(一个完整的业务消息包,一部分消息不算)
最近一次收到业务消息包的时间:收到字节就算
最近一次发送业务消息包的时间:发送字节就算
第一次连接成功的时间
进入重连队列时间
userid绑定(将ChannelContext和业务中的userid绑定,并提供查询、发送、解绑等API供业务端使用,一个userid可以绑定多个ChannelContext)
org.tio.core.Tio.bindUser(ChannelContext channelContext, String userid):将ChannelContext和userid绑定
org.tio.core.Tio.sendToUser(GroupContext groupContext, String userid, Packet packet):基于userid异步发送消息
org.tio.core.Tio.bSendToUser(GroupContext groupContext, String userid, Packet packet):基于userid阻塞发送消息
org.tio.core.Tio.getChannelContextsByUserid(GroupContext groupContext, String userid):通过userid获取ChannelContext
org.tio.core.Tio.unbindUser(GroupContext groupContext, String userid):解绑指定的userid
org.tio.core.Tio.unbindUser(ChannelContext channelContext):解绑所有的userid
token绑定(将ChannelContext和业务中的token绑定,并提供查询、发送、解绑等API供业务端使用,一个token可以绑定多个ChannelContext)
方法基本同userid绑定,不一一列举
group绑定(将ChannelContext和群组绑定,并提供查询、发送、解绑等API供业务端使用,一个group可以绑定多个ChannelContext,如果你有IM群聊场景,这个功能会大大减少你的业务端代码)
方法基本同userid绑定,不一一列举
bsId绑定(将ChannelContext和业务id绑定,并提供查询、发送、解绑等API供业务端使用,一个bsId只能绑定一个ChannelContext)
方法基本同userid绑定,不一一列举
框架内置自动和ip绑定(将ChannelContext和对端ip绑定,并提供查询、发送等API供业务端使用)
org.tio.core.Tio.sendToIp(GroupContext groupContext, String ip, Packet packet, ChannelContextFilter channelContextFilter)
org.tio.core.Tio.sendToIp(GroupContext groupContext, String ip, Packet packet)
org.tio.core.Tio.bSendToIp(GroupContext groupContext, String ip, Packet packet, ChannelContextFilter channelContextFilter)
org.tio.core.Tio.bSendToIp(GroupContext groupContext, String ip, Packet packet)
框架内置自动和ip:port绑定(将ChannelContext和对端ip:port绑定,并提供查询、发送等API供业务端使用)
org.tio.core.Tio.send(GroupContext groupContext, String ip, int port, Packet packet)
org.tio.core.Tio.bSend(GroupContext groupContext, String ip, int port, Packet packet)
框架内置自动和唯一uuid绑定(将ChannelContext和对端uuid绑定,并提供查询、发送等API供业务端使用)
org.tio.core.Tio.sendToId(GroupContext groupContext, String channelId, Packet packet)
org.tio.core.Tio.bSendToId(GroupContext groupContext, String channelId, Packet packet)
提供IP拉黑功能
org.tio.core.Tio.IpBlacklist.add(GroupContext groupContext, String ip):把指定ip拉黑
org.tio.core.Tio.IpBlacklist.remove(GroupContext groupContext, String ip):从黑名单中移除
org.tio.core.Tio.IpBlacklist.isInBlacklist(GroupContext groupContext, String ip):是否在黑名单中
org.tio.core.Tio.IpBlacklist.clear(GroupContext groupContext):清除黑名单
提供了分页查询会话功能
Page org.tio.core.Tio.getPageOfAll(GroupContext groupContext, Integer pageIndex, Integer pageSize)
Page org.tio.core.Tio.getPageOfAll(GroupContext groupContext, Integer pageIndex, Integer pageSize, Converter converter)
Page org.tio.core.Tio.getPageOfGroup(GroupContext groupContext, String group, Integer pageIndex, Integer pageSize
Page org.tio.core.Tio.getPageOfGroup(GroupContext groupContext, String group, Integer pageIndex, Integer pageSize, Converter converter)
异步发送能力(把packet丢到队列即返回)
Tio.java中以send开头的方法,譬如sendToAll()、sendToUser()、sendToGroup()等
阻塞发送能力(确认把packet发送到对端后再返回)
Tio.java中以bSend开头的方法,譬如bSendToAll()、bSendToUser()、bSendToGroup()等
同步发送能力(相当于act机制,需要业务端配合设置synSeq才能完成此功能)
org.tio.core.Tio.synSend(ChannelContext channelContext, Packet packet, long timeout)
基于t-io已经实现了tio-http-server
基于t-io已经实现了tio-websocket-server
基于t-io已经实现了IM能力
提供UDP能力
内置SSL能力,业务层只需要添加一行:https://my.oschina.net/talenttan/blog/1587197
groupContext.useSsl("/cert/xxx.jks", "/cert/xxx.jks", "******");
内置集群能力,这里也有一篇关于tio集群的文章,可以参考:https://my.oschina.net/zyw205/blog/1827495
org.tio.core.GroupContext.setTioClusterConfig(TioClusterConfig tioClusterConfig)
内置群组成员排序能力,一般用在直播间成员排序显示、IM群组排序显示等需要排序的场景
groupContext.groups.setChannelContextComparator(Comparator channelContextComparator)
t-io性能
t-io 30万TCP长连接测试报告,见:https://my.oschina.net/u/2369298/blog/915435
tio官网不间断运行88天,各项监控数据良好,见:https://gitee.com/uploads/images/2018/0607/150205_de698afe_351037.png
t-io生态
在册案例(更多的案例是不在册的):https://t-io.org/case/index.html
t-io相关博客:https://www.oschina.net/search?q=t-io&scope=blog&sort_by_time=1
t-io相关讨论:https://www.oschina.net/search?q=t-io&scope=bbs&catalog=1&sort_by_time=1
引入t-io
如果你只是想用tio-core,只需引入
dependency>groupId>org.t-iogroupId>artifactId>tio-coreartifactId>version>3.0.6.v20180626-RELEASEversion>dependency>
如果你想用tio-websocket-server,只需引入
dependency>groupId>org.t-iogroupId>artifactId>tio-websocket-serverartifactId>version>3.0.6.v20180626-RELEASEversion>dependency>
如果你想用tio-http-server,只需引入
dependency>groupId>org.t-iogroupId>artifactId>tio-http-serverartifactId>version>3.0.6.v20180626-RELEASEversion>dependency>
查看t-io最新版本
用于学习t-io各组件的showcase工程
tio-showcase (学习tio-core的最好示例)
tio-websocket-showcase (学习tio-websocket-server的最好示例,这里有篇文章可以看一下:https://my.oschina.net/talenttan/blog/1806324)
tio-udp-showcase (学习tio-udp-server的最好示例,这篇博客可以参考:https://my.oschina.net/talenttan/blog/1823774)
tio-http-server-showcase (用于学习tio-http-server,可以关注里面的TestController)
t-io番外
学习tio-core的步骤
熟练掌握ByteBuffer的使用,这是所有基于aio/nio编程的必修课程,这个懒没人躲得掉
下载tio-core示范程序:tio-showcase
导入到eclipse或其它ide中
对照helloworld例子和t-io的hello world走一遍
下载t-io源代码:t-io
简单地扫一下:org.tio.core.ChannelContext.java
简单地扫一下:org.tio.core.GroupContext.java
简单地扫一下:org.tio.core.Tio.java
最好要掌握org.tio.utils.lock.ObjWithLock及其子类(因为多线程环境下,对集合的遍历、元素删除、元素添加等操作必须是线程安全的)
我的个人博客可以关注一下,上面有不少t-io的文章:三流程序员的博客
忠告:tio-core已经封装了大量网络开发细节,如果你连上面的步骤都不愿意走一遍,建议你还是继续你的CRUD编程。
t-io推荐
智能客服系统 + 呼叫中心
服务了上万家的优质客服系统:优客服 - 开源的智能客服系统 + 呼叫中心
更专业的通用后台管理模板----layuiAdmin,layui作者亲自倾力打造

让网络编程更轻松和有趣 t-io的更多相关文章
- 学习java设计模式有用吗?懂这六个原则,编程更轻松
学习java设计模式有用吗?懂这六个原则,编程更轻松 1.开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实 ...
- 让编程更轻松的 7 个 Visual Studio 扩展 : 以下几个扩展,BuildVision可以用
是时候升级你最喜欢的IDE了!在这篇文章中,我将介绍一些我最喜欢的与众不同的 Visual Studio 扩展,是它们让我的日常编程工作变得更加轻松.对于一些明摆着的,例如 ReSharper 和 O ...
- Cats(3)- freeK-Free编程更轻松,Free programming with freeK
在上一节我们讨论了通过Coproduct来实现DSL组合:用一些功能简单的基础DSL组合成符合大型多复杂功能应用的DSL.但是我们发现:cats在处理多层递归Coproduct结构时会出现编译问题.再 ...
- 网络编程中的CAP & 有趣的存储框架(关系型、NoSQL)全图
第七篇 CAP https://zhuanlan.zhihu.com/p/20399316?refer=auxten CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s t ...
- 人工智能都能写Java了!这款插件让你编程更轻松
最近在浏览技术社区,发现了一款 IDE 插件,利用人工智能技术帮助程序员高效写代码.节省开发时间,一下子勾起了我的好奇心. 下载之后,使用一番,确实蛮好的,可以有效提升编程效率. 这款插件叫:aixc ...
- 网络编程基础【day10】:IO多路复用
这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”(事件),你小跑过去给他倒一杯,然后随他去吧,突然又一个要倒酒,你又过去倒上,就 ...
- PHP7 网络编程(六)Socket和IO多路复用【待】
https://blog.csdn.net/zhang197093/article/details/77366407
- Java网络编程和NIO详解9:基于NIO的网络编程框架Netty
Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...
- Java 网络编程学习总结
新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1] 网络编程认识 [2] TCP/IP编程 ...
随机推荐
- Eclipse with ADT的安装和配置
我们从安卓官方网站(https://developer.android.com/sdk/index.html#download)下载下来的eclipse是捆绑好了ADT的,所以不用自己安装插件,十分方 ...
- Python获取数字的二进制值
目标 想要获取一个整形数字的二进制表示 bin 内置函数 看一下官方的解释 Convert an integer number to a binary string prefixed with &qu ...
- .Net Core HTML解析利器之HtmlAgilityPack
一 .HtmlAgilityPack简介 这是一个敏捷的HTML解析器,它构建了一个读/写DOM,并支持简单的XPATH或XSLT(实际上,你实际上并不了解XPATH和XSLT来使用它,不必担心).它 ...
- J2ee高并发情况下监听器
引言:在高并发下限制最大并发次数,在web.xml中用过滤器设置參数(最大并发数),并设置其它相关參数.具体见代码. 第一步:配置web.xml配置,不懂的地方解释一下:參数50通过參数名maxCon ...
- JavaScript:RegExp 对象
ylbtech-JavaScript:RegExp 对象 1.返回顶部 RegExp 对象 RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具. 直接量语法 /pattern/att ...
- Verilog 加法器和减法器(2)
类似半加器和全加器,也有半减器和全减器. 半减器只考虑当前两位二进制数相减,输出为差以及是否向高位借位,而全减器还要考虑当前位的低位是否曾有借位.它们的真值表如下: 对半减器,diff = x ^y, ...
- RV32C指令集
Risc-V支持16位压缩格式,压缩格式立即数位数更少,能使用的寄存器也比较少,有些指令只能用常用8个整数寄存器(x8-x15)或者(f8-f15). 每个RVC指令都有对应的32位指令,下表列出所有 ...
- 前端Js框架汇总【转】
概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领域心花路放,也是煞是羡慕.寻了寻.net的消息,也是振奋人心,.net co ...
- MultipleRegularExpressionAttribute MVC中扩展自定义验证规则
好久都没有写博客,最近工作中没有什么可写的,公司的项目是以业务为重,技术含量实在不咋的.这次sprint中有一个要求就是password必须一些规则,比如给你一些正则表达式必须满足几个,直接看效果吧 ...
- MySql 5.7安装(随机密码,修改默认密码)两个坑
MySql 5.7安装(随机密码,修改默认密 下载了MySql 最新版本,安装的过程中,发现了很多新特性 1.data目录不见了 在进行my-default.ini配置的时候 (需要配置 # base ...