注:本文不会讲解网络编程中的一些基础知识(如半粘包,七层协议等),默认你学习使用过Netty或了解过网络编程
一、Tio 和 Netty 🎨
众所周知 Netty
作为 NIO
网络应用框架,可以帮助我们 快速开发高性能、高稳定的网络通信服务,它的强大已经在各种知名技术(如Dubbo、RocketMQ)中体现。网上也一直有流传 想成为一位高级工程师,Netty将是你必须要掌握的技术栈。
而 Tio
一般是指 Tio-core,它是基于AIO
的网络编程框架,和Netty
属于同类。
Netty
已经很强大了,那如何要去使用 Tio
呢?
GTIEE
官网有一句话:网络编程很苦,用t-io后会很甜。Tio
是从项目抽象出来的框架,所以 Tio
提供了更多的和业务相关的API,大体上具有如下特点和能力:
我们使用 Tio
其实就是大量使用Tio这个类提供的各种方法,我们先来了解一些方法和基础类
资源绑定是指把业务相关的数据和 Tcp连接
(即ChannelContext)关联起来,譬如ChannelContext-A代表了用户张三,张三的userid是 1
(什么是ChannelContext在 2.3
中讲解)
// t-io目前内置了4种资源绑定
// 绑定用户
Tio.bindUser(ChannelContext-A, "1");
// 绑定token
Tio.bindToken(ChannelContext-A, "fdsafd1513f1dasf15");
// 绑定群组 如 pc-用户id
Tio.bindGroup(ChannelContext-A, "pc-1");
// 绑定业务id
Tio.bindBsId(ChannelContext-A, "30001");
既然有绑定,就肯定会有解绑,这是个和绑定相反的操作
/**
* 解绑业务id
* @param channelContext
*/
public static void unbindBsId(ChannelContext channelContext) {
channelContext.tioConfig.bsIds.unbind(channelContext);
}
/**
* 与所有组解除解绑关系
* @param channelContext
*/
public static void unbindGroup(ChannelContext channelContext) {
channelContext.tioConfig.groups.unbind(channelContext);
}
/**
* 与指定组解除绑定关系
* @param group
* @param channelContext
*/
public static void unbindGroup(String group, ChannelContext channelContext) {
channelContext.tioConfig.groups.unbind(group, channelContext);
}
/**
* 解除channelContext绑定的token
* @param channelContext
*/
public static void unbindToken(ChannelContext channelContext) {
channelContext.tioConfig.tokens.unbind(channelContext);
}
// org.tio.core.TioConfig.ipBlacklist
/**
* 解除channelContext绑定的userid
* @param channelContext
*/
public static void unbindUser(ChannelContext channelContext) {
channelContext.tioConfig.users.unbind(channelContext);
}
/**
* 解除userid的绑定。一般用于多地登录,踢掉前面登录的场景
* @param tioConfig
* @param userid
*/
public static void unbindUser(TioConfig tioConfig, String userid) {
tioConfig.users.unbind(tioConfig, userid);
}
在 Tio
中每一个tcp连接的建立都会产生一个ChannelContext对象,这是个抽象类,如果你是用t-io作tcp客户端,那么就是ClientChannelContext,如果你是用tio作tcp服务器,那么就是ServerChannelContext。
ChannelContext是 Tio
中非常重要的类,它是业务和连接的沟通桥梁。
Tio
后立即返回,返回时Packet并没有被发送,而只是提交到了待发送队列2.6
中讲解2.5
中讲解Tio
把Packet送给对方后才返回2.6
中讲解2.5
中讲解可以看到上面的发送方法,不管是异步、阻塞,参数列表都需要一个TioConfig对象,那它是什么呢?
场景:我们在写TCP Server时,都会先选好一个端口以监听客户端连接,再创建N组线程池来执行相关的任务,譬如发送消息、解码数据包、处理数据包等任务。还要维护客户端连接的各种数据,为了和业务互动,还要把这些客户端连接和各种业务数据绑定起来,譬如把某个客户端绑定到一个群组,绑定到一个userid,绑定到一个token等。
TioConfig 就是解决以上场景的:配置线程池、监听端口,维护客户端各种数据等的。
上面有讲到,一个tcp连接就是一个ChannelContext对象,而每一个而ChannelContext对象又拥有对应TioConfig对象,我们调用发送消息方法,传递的 TioConfig 就是 这个用户(tcp连接)对应的各种数据和配置。
Packet是用于表述业务数据结构的,我们通过继承Packet来实现自己的业务数据结构,对于各位而言,把Packet看作是一个普通的VO对象即可。
注意:不建议直接使用Packet对象,而是要继承Packet