(一)球球的线程模型
1.Acceptor主要负责异步接受连接请求
2.连接成功后,创建一个TSession
3.根据特定规则,TSession绑定一个Processor
4.Processor主要负责TSession的读写
场景内线程模型
场景中使用的是单线程tick模式,后端每秒30帧速度进行tick。
(一)消息的接收
(1)在facade层中提供方法,并使用@HandlerAnno注解,实现中会根据消息类型调用此方法
(2)具体实现
1.Processor使用selector,监听到客户端发包
2.Processor把输入读取到Buffer中,并检查是否有粘包情况
3.Processor调用Serilizer解包(根据buffer中的classId获取到对应Serilizer)
4.解包后(异步)调用Session中的ActionDispatch的handlePacket方法处理包,ActionDispatcher根据Packet中的classId获取注册的方法并调用
(二)消息发送
(1)使用方式
使用Tsession的sendPacket方法发送消息,方法立即返回,消息会异步发送
(2)具体实现
1.业务层调用sendPacket方法,存放包到队列中,并唤醒关联Processor线程
2.Processor检查到SelectorKey有write标记,调用TSession的writeData方法
3.Tsession的writeData方法循环把队列中的包转成二进制存放到Buffer中
4.调用关联的SocketChannel发送Buffer数据
5.Buffer复位
(三)消息编解码
(1)设计
提供Serilizer接口,要求所有实现类复写readObject和wriiteObject方法,并注册到Serlizer的静态属性中,灵活可扩展特殊类型的编解码。
每个消息包由message.xml定义的classId ,length是包的长度,data是包的而数据
简单类型的解码就没有length数据,通过 readInt/readFloat等等直接读取
复杂类型如Map的编码:
1.读取map的长度
2.读取一个flag,判断key和value是唯一的,还是可以重复的
3.读取key的classId,获取对应的Serializer,value同样如此
4根据获取的key的Serializer和value的Serializer,循环解码key对象和value对象,并存放到map中