(一)球球的線程模型
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中