原文:https://www.oschina.net/p/t-io

注意:还是尽量去看原文,因为原文下面的评论也很有意思,可以参考大牛的讨论学习到新的东西

授权协议:Apache
开发语言:Java
操作系统:跨平台
软件作者:talent-tan
 
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应用场景的一些案例

tio-core提供了哪些功能

  • 内置对半包和粘包的处理:源码分析见:https://my.oschina.net/talenttan/blog/1610690

  • ChannelContext资源维护:会话资源维护是个工程量大,复杂度高的活,尤其是涉及到各种资源绑定、解绑、遍历时,极易出错和OOM,不过这些复杂的事件tio-core全部给你做好了,除非你要自己额外去绑定资源

  • 心跳检测(防止不良客户端占着TCP连接无所事事)

  • 心跳发送(client)

  • 断链重连(client)

  • 流量监控统计,既提供单条ChannelContext流量统计,又提供所有ChannelContext流量统计,下面所列为部分监控数据,详情请见:ChannelStat.javaGroupStat.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生态

引入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各组件的showcase工程

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推荐

让网络编程更轻松和有趣 t-io的更多相关文章

  1. 学习java设计模式有用吗?懂这六个原则,编程更轻松

    学习java设计模式有用吗?懂这六个原则,编程更轻松 1.开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实 ...

  2. 让编程更轻松的 7 个 Visual Studio 扩展 : 以下几个扩展,BuildVision可以用

    是时候升级你最喜欢的IDE了!在这篇文章中,我将介绍一些我最喜欢的与众不同的 Visual Studio 扩展,是它们让我的日常编程工作变得更加轻松.对于一些明摆着的,例如 ReSharper 和 O ...

  3. Cats(3)- freeK-Free编程更轻松,Free programming with freeK

    在上一节我们讨论了通过Coproduct来实现DSL组合:用一些功能简单的基础DSL组合成符合大型多复杂功能应用的DSL.但是我们发现:cats在处理多层递归Coproduct结构时会出现编译问题.再 ...

  4. 网络编程中的CAP & 有趣的存储框架(关系型、NoSQL)全图

    第七篇 CAP https://zhuanlan.zhihu.com/p/20399316?refer=auxten   CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s t ...

  5. 人工智能都能写Java了!这款插件让你编程更轻松

    最近在浏览技术社区,发现了一款 IDE 插件,利用人工智能技术帮助程序员高效写代码.节省开发时间,一下子勾起了我的好奇心. 下载之后,使用一番,确实蛮好的,可以有效提升编程效率. 这款插件叫:aixc ...

  6. 网络编程基础【day10】:IO多路复用

    这些名词比较绕口,理解涵义就好.一个epoll场景:一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”(事件),你小跑过去给他倒一杯,然后随他去吧,突然又一个要倒酒,你又过去倒上,就 ...

  7. PHP7 网络编程(六)Socket和IO多路复用【待】

    https://blog.csdn.net/zhang197093/article/details/77366407

  8. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  9. Java 网络编程学习总结

    新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1]    网络编程认识                [2]  TCP/IP编程 ...

随机推荐

  1. Linux学习17-gitlab访问慢502问题优化

    前言 浏览器访问gitlab的web页面,发现非常慢,并且很容易出现502问题.其中一个原因就是8080端口被tomcat占用,前面一篇已经更换了端口,但还是很慢. 后来搜了下,原因是gitlab占用 ...

  2. ArrayList 排序方法的性能对比

    20000=>ZXP 二分法 getSeriesMinSort2(list) Time is 67000 20000=>循环 getSeriesMinSortFor(list) Time ...

  3. navicat for mysql只导出数据表结构

    选中需要导出表结构的数据库,右键,在显示的菜单中选择“数据传输”这一项 ,在弹出窗口中“数据传输”单击选择“高级”一项,在“高级”中把“记录选项”中的勾去掉,在做一些设置,最后导出表数据就不会导出记录 ...

  4. linux cpu 100% 脚本

    for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/d ...

  5. VS Code搭建.NetCore开发环境(一)

    一.使用命令创建并运行.Net Core程序 1.dotnet new  xxx:创建指定类型的项目console,mvc,webapi 等 2.dotnet restore :加载依赖项 dotne ...

  6. Asp.netMVC中Html.Partial,RenderPartial,Action,RenderAction区别和用法

    https://www.2cto.com/kf/201702/602449.html Partial 和RenderPartial: 这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传 ...

  7. Linux修改终端显示前缀及环境变量

    Linux终端前面默认显示一长串,如: [work@aaa.baidu.com dir]$ 这是由PS1环境变量决定的: [work@aaa.baidu.com dir]$ echo $PS1 [\u ...

  8. Win7局域网打印机共享设置(详细图文流程)

    本文将向读者说明在Win7下如何实现同个局域网内共享打印机.经过测试,Win7之间和Win7与XP之间均可正常连接. 第一步:取消禁用Guest用户 1. 点击[开始]按钮,在[计算机]上右键,选择[ ...

  9. Gas Station leetcode java

    题目: There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. ...

  10. javascript this详解 面向对象

    在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字     虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的.JavaS ...