讓網絡編程更輕松和有趣 t-io


原文:https://www.oschina.net/p/t-io

注意:還是盡量去看原文,因為原文下面的評論也很有意思,可以參考大牛的討論學習到新的東西

Apache
Java
跨平台
talent-tan
 
t-io 詳細介紹

t-io: 讓天下沒有難開發的網絡編程

舊時王謝堂前燕,飛入尋常百姓家----當年那些王謝貴族們才擁有的"百萬級即時通訊"應用,將因為t-io的誕生,紛紛飛入普通人家的屋檐下。

t-io是啥

  • 大家口中的t-io一般是指tio-core,它是基於java aio的網絡編程框架,和netty屬於同類

  • 基於tio-core來開發IM、TCP私有協議、RPC、游戲服務器端、推送服務、實時監控、物聯網將會變得空前的簡單。

  • t-io家族除了tio-core外,還有tio-websocket-server、tio-http-server、tio-webpack-core、tio-flash-policy-server等,后面所列都是基於tio-core開發的應用層組件

  • 列一下t-io家族成員:

    • tio-core:基於java aio的網絡編程框架。使用示例:tio-showcase

    • tio-websocket-server:基於tio-core開發的websocket服務器。使用示例:tio-websocket-showcase

    • tio-http-server:基於tio-core開發的http服務器。使用示例:tio-http-server-showcase

    • tio-webpack-core:基於tio-core開發的js/css/html編譯壓縮工具,代碼已經開源,但尚無使用文檔和示例,暫時屬於內用階段,使用案例:http://www.nb350.com

    • tio-flash-policy-server:基於tio-core開發的flash-policy-server,代碼已經開源,但尚無使用文檔和示例

  • 列一下tio-core應用場景的一些案例

tio-core提供了哪些功能

  • 內置對半包和粘包的處理:源碼分析見:https://my.oschina.net/talenttan/blog/1610690

  • ChannelContext資源維護:會話資源維護是個工程量大,復雜度高的活,尤其是涉及到各種資源綁定、解綁、遍歷時,極易出錯和OOM,不過這些復雜的事件tio-core全部給你做好了,除非你要自己額外去綁定資源

  • 心跳檢測(防止不良客戶端占着TCP連接無所事事)

  • 心跳發送(client)

  • 斷鏈重連(client)

  • 流量監控統計,既提供單條ChannelContext流量統計,又提供所有ChannelContext流量統計,下面所列為部分監控數據,詳情請見:ChannelStat.javaGroupStat.java

    • 已接收的字節數

    • 已接收了多少次TCP數據包

    • 已接收的packet數

    • 已處理的字節數

    • 已處理的packet數

    • 處理消息包耗時,單位:毫秒。拿這個值除以handledPackets,就是處理每個消息包的平均耗時

    • 已發送的字節數

    • 已發送的packet數

    • 最近一次收到業務消息包的時間(一個完整的業務消息包,一部分消息不算)

    • 最近一次發送業務消息包的時間(一個完整的業務消息包,一部分消息不算)

    • 最近一次收到業務消息包的時間:收到字節就算

    • 最近一次發送業務消息包的時間:發送字節就算

    • 第一次連接成功的時間

    • 進入重連隊列時間

  • userid綁定(將ChannelContext和業務中的userid綁定,並提供查詢、發送、解綁等API供業務端使用,一個userid可以綁定多個ChannelContext)

    • org.tio.core.Tio.bindUser(ChannelContext channelContext, String userid):將ChannelContext和userid綁定

    • org.tio.core.Tio.sendToUser(GroupContext groupContext, String userid, Packet packet):基於userid異步發送消息

    • org.tio.core.Tio.bSendToUser(GroupContext groupContext, String userid, Packet packet):基於userid阻塞發送消息

    • org.tio.core.Tio.getChannelContextsByUserid(GroupContext groupContext, String userid):通過userid獲取ChannelContext

    • org.tio.core.Tio.unbindUser(GroupContext groupContext, String userid):解綁指定的userid

    • org.tio.core.Tio.unbindUser(ChannelContext channelContext):解綁所有的userid

  • token綁定(將ChannelContext和業務中的token綁定,並提供查詢、發送、解綁等API供業務端使用,一個token可以綁定多個ChannelContext)

    • 方法基本同userid綁定,不一一列舉

  • group綁定(將ChannelContext和群組綁定,並提供查詢、發送、解綁等API供業務端使用,一個group可以綁定多個ChannelContext,如果你有IM群聊場景,這個功能會大大減少你的業務端代碼)

    • 方法基本同userid綁定,不一一列舉

  • bsId綁定(將ChannelContext和業務id綁定,並提供查詢、發送、解綁等API供業務端使用,一個bsId只能綁定一個ChannelContext)

    • 方法基本同userid綁定,不一一列舉

  • 框架內置自動和ip綁定(將ChannelContext和對端ip綁定,並提供查詢、發送等API供業務端使用)

    • org.tio.core.Tio.sendToIp(GroupContext groupContext, String ip, Packet packet, ChannelContextFilter channelContextFilter)

    • org.tio.core.Tio.sendToIp(GroupContext groupContext, String ip, Packet packet)

    • org.tio.core.Tio.bSendToIp(GroupContext groupContext, String ip, Packet packet, ChannelContextFilter channelContextFilter)

    • org.tio.core.Tio.bSendToIp(GroupContext groupContext, String ip, Packet packet)

  • 框架內置自動和ip:port綁定(將ChannelContext和對端ip:port綁定,並提供查詢、發送等API供業務端使用)

    • org.tio.core.Tio.send(GroupContext groupContext, String ip, int port, Packet packet)

    • org.tio.core.Tio.bSend(GroupContext groupContext, String ip, int port, Packet packet)

  • 框架內置自動和唯一uuid綁定(將ChannelContext和對端uuid綁定,並提供查詢、發送等API供業務端使用)

    • org.tio.core.Tio.sendToId(GroupContext groupContext, String channelId, Packet packet)

    • org.tio.core.Tio.bSendToId(GroupContext groupContext, String channelId, Packet packet)

  • 提供IP拉黑功能

    • org.tio.core.Tio.IpBlacklist.add(GroupContext groupContext, String ip):把指定ip拉黑

    • org.tio.core.Tio.IpBlacklist.remove(GroupContext groupContext, String ip):從黑名單中移除

    • org.tio.core.Tio.IpBlacklist.isInBlacklist(GroupContext groupContext, String ip):是否在黑名單中

    • org.tio.core.Tio.IpBlacklist.clear(GroupContext groupContext):清除黑名單

  • 提供了分頁查詢會話功能

    • Page org.tio.core.Tio.getPageOfAll(GroupContext groupContext, Integer pageIndex, Integer pageSize)

    • Page org.tio.core.Tio.getPageOfAll(GroupContext groupContext, Integer pageIndex, Integer pageSize, Converter converter)

    • Page org.tio.core.Tio.getPageOfGroup(GroupContext groupContext, String group, Integer pageIndex, Integer pageSize

    • Page org.tio.core.Tio.getPageOfGroup(GroupContext groupContext, String group, Integer pageIndex, Integer pageSize, Converter converter)

  • 異步發送能力(把packet丟到隊列即返回)

    • Tio.java中以send開頭的方法,譬如sendToAll()、sendToUser()、sendToGroup()等

  • 阻塞發送能力(確認把packet發送到對端后再返回)

    • Tio.java中以bSend開頭的方法,譬如bSendToAll()、bSendToUser()、bSendToGroup()等

  • 同步發送能力(相當於act機制,需要業務端配合設置synSeq才能完成此功能)

    • org.tio.core.Tio.synSend(ChannelContext channelContext, Packet packet, long timeout)

  • 基於t-io已經實現了tio-http-server

  • 基於t-io已經實現了tio-websocket-server

  • 基於t-io已經實現了IM能力

  • 提供UDP能力

  • 內置SSL能力,業務層只需要添加一行:https://my.oschina.net/talenttan/blog/1587197

    • groupContext.useSsl("/cert/xxx.jks", "/cert/xxx.jks", "******");

  • 內置集群能力,這里也有一篇關於tio集群的文章,可以參考:https://my.oschina.net/zyw205/blog/1827495

    • org.tio.core.GroupContext.setTioClusterConfig(TioClusterConfig tioClusterConfig)

  • 內置群組成員排序能力,一般用在直播間成員排序顯示、IM群組排序顯示等需要排序的場景

    • groupContext.groups.setChannelContextComparator(Comparator channelContextComparator)

t-io性能

t-io生態

引入t-io

  • 如果你只是想用tio-core,只需引入

dependency>groupId>org.t-iogroupId>artifactId>tio-coreartifactId>version>3.0.6.v20180626-RELEASEversion>dependency>
  • 如果你想用tio-websocket-server,只需引入

dependency>groupId>org.t-iogroupId>artifactId>tio-websocket-serverartifactId>version>3.0.6.v20180626-RELEASEversion>dependency>
  • 如果你想用tio-http-server,只需引入

dependency>groupId>org.t-iogroupId>artifactId>tio-http-serverartifactId>version>3.0.6.v20180626-RELEASEversion>dependency>

用於學習t-io各組件的showcase工程

t-io番外

學習tio-core的步驟

  • 熟練掌握ByteBuffer的使用,這是所有基於aio/nio編程的必修課程,這個懶沒人躲得掉

  • 下載tio-core示范程序:tio-showcase

  • 導入到eclipse或其它ide中

  • 對照helloworld例子和t-io的hello world走一遍

  • 下載t-io源代碼:t-io

  • 簡單地掃一下:org.tio.core.ChannelContext.java

  • 簡單地掃一下:org.tio.core.GroupContext.java

  • 簡單地掃一下:org.tio.core.Tio.java

  • 最好要掌握org.tio.utils.lock.ObjWithLock及其子類(因為多線程環境下,對集合的遍歷、元素刪除、元素添加等操作必須是線程安全的)

  • 我的個人博客可以關注一下,上面有不少t-io的文章:三流程序員的博客

  • 忠告:tio-core已經封裝了大量網絡開發細節,如果你連上面的步驟都不願意走一遍,建議你還是繼續你的CRUD編程。

t-io推薦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM