天下之事常成于困约,而败于奢靡。这篇文章主要讲述网络编程框架t-io的编程基本知识介绍相关的知识,希望能为你提供帮助。
t-io作为目前国内最流行的开源网络编程框架软件,以简单易懂,上手容易而著称,相同的功能比起netty实现起来,要简单的多,代码量也大大减少,如果要使用好t-io,还是要先学习t-io的一些基本知识,这篇文章主要从8个方面介绍了t-io的基础知识。 具体请参考:??https://www.wanetech.com/doc/tio/88??
t-io收发消息过程
t-io收发消息及处理过程,可以用一张图清晰地表达出来
应用层包:Packet
Packet是用于表述业务数据结构的,我们通过继承Packet来实现自己的业务数据结构,对于各位而言,把Packet看作是一个普通的VO对象即可。
注意:不建议直接使用Packet对象,而是要继承Packet
一个简单的Packet可能长这样
package org.tio.study.helloworld.common;
import org.tio.core.intf.Packet;
/**
* @author tanyaowu
*/
public class HelloPacket extends Packet {
private static final long serialVersionUID = -172060606924066412L;
public static final int HEADER_LENGTH = 4;
//消息头的长度
public static final String CHARSET = "utf-8";
private byte[] body;
/**
* @return the body
*/
public byte[] getBody() {
return body;
}
/**
* @param body the body to set
*/
public void setBody(byte[] body) {
this.body = body;
}
}
可以结合AioHandler.java理解Packet
package org.tio.core.intf;
import java.nio.ByteBuffer;
import org.tio.core.ChannelContext;
import org.tio.core.TioConfig;
import org.tio.core.exception.AioDecodeException;
/**
*
* @author tanyaowu
* 2017年10月19日 上午9:40:15
*/
public interface AioHandler {
/**
* 根据ByteBuffer解码成业务需要的Packet对象.
* 如果收到的数据不全,导致解码失败,请返回null,在下次消息来时框架层会自动续上前面的收到的数据
* @param buffer 参与本次希望解码的ByteBuffer
* @param limit ByteBuffer的limit
* @param position ByteBuffer的position,不一定是0哦
* @param readableLength ByteBuffer参与本次解码的有效数据(= limit - position)
* @param channelContext
* @return
* @throws AioDecodeException
*/
Packet decode(ByteBuffer buffer, int limit, int position, int readableLength, ChannelContext channelContext) throws AioDecodeException;
/**
* 编码
* @param packet
* @param tioConfig
* @param channelContext
* @return
* @author: tanyaowu
*/
ByteBuffer encode(Packet packet, TioConfig tioConfig, ChannelContext channelContext);
/**
* 处理消息包
* @param packet
* @param channelContext
* @throws Exception
* @author: tanyaowu
*/
void handler(Packet packet, ChannelContext channelContext) throws Exception;
}
单条TCP连接上下文:ChannelContext
每一个tcp连接的建立都会产生一个ChannelContext对象,这是个抽象类,如果你是用t-io作tcp客户端,那么就是ClientChannelContext,如果你是用tio作tcp服务器,那么就是ServerChannelContext
【网络编程框架t-io的编程基本知识介绍】
用户可以把业务数据通过ChannelContext对象和TCP连接关联起来,像下面这样设置属性
ChannelContext.set(String key, Object value)
然后用下面的方式获取属性
ChannelContext.get(String key)
当然最最常用的还是用t-io提供的强到没对手的bind功能,譬如用下面的代码绑定userid
Tio.bindUser(ChannelContext channelContext, String userid)
然后可以通过userid进行操作,示范代码如下
//获取某用户的ChannelContext集合
SetWithLock<
ChannelContext>
set = Tio.getChannelContextsByUserid(tioConfig, userid);
//给某用户发消息
Tio.sendToUser(TioConfig, userid, Packet)
除了可以绑定userid,t-io还内置了如下绑定API
Tio.bindBsId(ChannelContext channelContext, String bsId)
Tio.bindToken(ChannelContext channelContext, String token)
Tio.bindGroup(ChannelContext channelContext, String group)
ChannelContext对象包含的信息非常多,主要对象见下图
说明
ChannelContext是t-io中非常重要的类,他是业务和连接的沟通桥梁!
服务配置与维护:TioConfig
?
推荐阅读
- 12月活动|重拾写作的力量,挑战7/14/21日连更!
- Java 将Word转为OFD
- 作业帮上万个 CronJob 和在线业务混部,如何解决弱隔离问题并进一步提升资源利用率()
- #私藏项目实操分享#Android开发(当前项目以Module形式引用别的项目的步骤)
- #yyds干货盘点#Linux里的“宝塔”,真正的宝塔!详细教程
- MS radius 约束SSID VLAN细化无线安全认证
- 单例模式 --- 生产环境怎么写#yyds干货盘点#
- #yyds干货盘点# 100个 Unity小知识点 | Unity中常用的几种单例写法
- KAFKA最新版 3.0.0集群部署测试