国产开源网络编程框架t

编程入门 行业动态 更新时间:2024-10-26 16:33:09

国产<a href=https://www.elefans.com/category/jswz/34/1770131.html style=开源网络编程框架t"/>

国产开源网络编程框架t

t-io作为目前国内最流行的开源网络编程框架软件,以简单易懂,上手容易而著称,相同的功能比起netty实现起来,要简单的多,代码量也大大减少,如果要使用好t-io,还是要先学习t-io的一些基本知识,这篇文章主要从8个方面介绍了t-io的基础知识。 具体请参考:

您尚未登录,不能阅读文档! - 谭聊

t-io收发消息过程

t-io收发消息及处理过程,可以用一张图清晰地表达出来

 应用层包:Packet

Packet是用于表述业务数据结构的,我们通过继承Packet来实现自己的业务数据结构,对于各位而言,把Packet看作是一个普通的VO对象即可。

注意:不建议直接使用Packet对象,而是要继承Packet

一个简单的Packet可能长这样

package org.tio.study.helloworldmon;
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

 用户可以把业务数据通过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

绑定业务id

Tio.bindBsId(ChannelContext channelContext, String bsId)

绑定token

Tio.bindToken(ChannelContext channelContext, String token)

 绑定群组

Tio.bindGroup(ChannelContext channelContext, String group)

ChannelContext对象包含的信息非常多,主要对象见下图

说明

ChannelContext是t-io中非常重要的类,他是业务和连接的沟通桥梁!

服务配置与维护:TioConfig

  • 场景:我们在写TCP Server时,都会先选好一个端口以监听客户端连接,再创建N组线程池来执行相关的任务,譬如发送消息、解码数据包、处理数据包等任务,还要维护客户端连接的各种数据,为了和业务互动,还要把这些客户端连接和各种业务数据绑定起来,譬如把某个客户端绑定到一个群组,绑定到一个userid,绑定到一个token等。
  • TioConfig就是解决以上场景的:配置线程池、监听端口,维护客户端各种数据等的。

  • TioConfig是个抽象类

    • 如果你是用tio作tcp客户端,那么你需要创建ClientTioConfig对象
      • 服务器端对应一个ClientTioConfig对象
    • 如果你是用tio作tcp服务器,那么你需要创建ServerTioConfig
      • 一个监听端口对应一个ServerTioConfig ,一个jvm可以监听多个端口,所以一个jvm可以有多个ServerTioConfig对象
  • TioConfig对象包含的信息非常多,主要对象见下图

如何获取TioConfig对象

见:如何获取TioConfig对象

编码、解码、处理:AioHandler

AioHandler是处理消息的核心接口,它有两个子接口,ClientAioHandler和ServerAioHandler,当用tio作tcp客户端时需要实现ClientAioHandler,当用tio作tcp服务器时需要实现ServerAioHandler,它主要定义了3个方法,见下

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) th

更多推荐

国产开源网络编程框架t

本文发布于:2024-02-12 22:51:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1689708.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:开源   网络编程   框架

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!