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

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

注意:仍是儘可能去看原文,由於原文下面的評論也頗有意思,能夠參考大牛的討論學習到新的東西

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

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

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

t-io是啥

  • 你們口中的t-io通常是指tio-core,它是基於java aio的網絡編程框架,和netty屬於同類html

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

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

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

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

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

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

    • 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推薦

相關文章
相關標籤/搜索