学习tio就像学习新的语言一样,我是从老谭提供的HelloWorld示例(在官网的tio-study包中)开始的。因为对java不是很熟悉,所以学习过程中的一些见解可能有误,欢迎老湿们留言指正哈!
1. Hello-World中的模块和目录结构
HelloWorld示例是通过Maven构建的,其中的项目配置和依赖都写在了pom.xml文件中。其中Hello-World由三个Module(模块)构成,分别的common、server、client模块,这三个模块的Parent都是parent模块(parent模块的pom.xml中标注了开发者信息和子模块的路径信息)。
以下是各个模块中的依赖(dependency)
common模块
- tio-core(tio框架,我们平时说的tio其实就是tio-core)
- logback-classic(log4j的一个改良版本,同时实现了slf4j的接口,这样你如果之后要切换其他日志组件也是一件很容易的事)
- logback-access(访问模块与Servlet容器集成提供通过Http来访问日志的功能)
- jcl-over-slf4j(log桥接工具)
- jul-to-slf4j(Jul日志转为Slf4j输出)
- log4j-over-slf4j(用于日志路由)
- junit(单元测试框架)
- testng(测试框架)
server模块
- tio-core(上方已解释)
- tio-study-helloworld-common(就是上方的common模块,会继承common模块的依赖,以及能调用各种父模块的接口 方法 类等等资源)
- junit(单元测试框架)
- testng(测试框架)
client模块
- tio-core(上方已解释)
- tio-study-helloworld-common(就是上方的common模块,会继承common模块的依赖,以及能调用各种父模块的接口 方法 类等等资源)
- junit(单元测试框架)
- testng(测试框架)
目录结构
org.tio.study.helloworld.common目录下
- Const.java(接口文件,定义了3个变量:SERVER(String,服务器地址)、PORT(int,tcp监控端口)、TIMEOUT(int,心跳超时时间))
- HelloPacket.java(继承于org.tio.core.intf.Packet类;定义了4个变量:serialVersionUID(long,序列化中判断类的serialVersionUID来验证版本一致性的)、HEADER_LENGTH(int,消息头部长度)、CHARSET(String,编码)、body(byte[],消息体);定义了2个方法:getBody()—-获取消息体、setBody()—-设置消息体)
org.tio.study.helloworld.server目录下
- HelloServerAioHandler.java(服务端消息处理文件,重写了两个方法:decode()—-把接收到的ByteBuffer,解码成应用可以识别的业务消息包、encode()—-编码:把业务消息包编码为可以发送的ByteBuffer)
- HelloServerStarter.java(6个变量:aioHandler(handler, 包括编码、解码、消息处理)、aioListener(事件监听器,可以为null,但建议自己实现该接口,可以参考showcase了解些接口)、serverTioConfig(一组连接共用的上下文对象)、tioServer(tioServer对象)、serverIp(有时候需要绑定ip,不需要则null)、serverPort(监听的端口);一个函数:main(启动函数)
org.tio.study.helloworld.client目录下
- HelloClientAioHandler.java(客户端消息处理文件,1个变量:heartbeatPacket(心跳包);重写了4个方法:decode()—-把接收到的ByteBuffer,解码成应用可以识别的业务消息包、encode()—-编码:把业务消息包编码为可以发送的ByteBuffer、handler()—-处理消息、heartbeatPacket—-心跳方法,此方法如果返回null,框架层面则不会发心跳;如果返回非null,框架层面会定时发本方法返回的消息包)
- HelloServerStarter.java(7个变量:serverNode(服务器节点)、tioClientHandler(handler, 包括编码、解码、消息处理)、aioListener(事件监听器,可以为null,但建议自己实现该接口,可以参考showcase了解些接口)、reconnConf(断链后自动连接的,不想自动连接请设为null)、clientTioConfig(一组连接共用的上下文对象)、tioClient(tioClient对象)、clientChannelContext(客户端上下文);2个函数:main(启动函数)、send(发送消息函数)
2. Hello-World启动流程
- 先启动server模块中的main函数
//先设置心跳超时时间
serverTioConfig.setHeartbeatTimeout(org.tio.study.helloworld.common.Const.TIMEOUT);
//再启动指定端口监听,执行完成后无异常则启动成功
tioServer.start(serverIp, serverPort);
- 再启动client模块中的main函数
//配置心跳超时时间
clientTioConfig.setHeartbeatTimeout(Const.TIMEOUT);
//实例化一个tioClient对象
tioClient = new TioClient(clientTioConfig);
//链接指定服务节点
clientChannelContext = tioClient.connect(serverNode);
//连上后,发条消息玩玩
send();
上面的分析和记录只是最简单的tio使用表象,tio具体运行原理,目前还在研究中,我会记录到以后的博文中。