國產開源網絡編程框架t-io使用必備:極速開發器Tio.java

語言: CN / TW / HK

Tio.java簡介

  • 為了讓用户減少查找API的時間,t-io把常用API以靜態方法的形式彙集於一個類,這就是Tio.java
  • Tio.java本身並不實現過複雜的業務,各業務實現仍然分佈在其它類中,Tio.java只是把用户關心的API集中起來,便於用IDE查找而已

業務數據綁定

  • 資源綁定是指把業務相關的數據和Tcp連接(即ChannelContext)關聯起來,譬如ChannelContext-A代表了用户張三,張三的userid是333,就用下面的代碼進行綁定

  • Tio.bindUser(ChannelContext-A, "333")

  • t-io目前內置了4種資源綁定,當然用户可以靈活使用這些綁定從而解決業務層所有的資源綁定問題,譬如可以給group加前綴”ios-“,從而標記這個用户使用的是ios,譬如

  • Tio.bindGroup(ChannelContext-A, "333");
  • Tio.bindGroup(ChannelContext-A, "ios-" + "333");
  • 內置的4種資源綁定方法中,一個ChannelContext是可以綁定到多個groupid的,其它三個綁定都是一對一或多對一的關係,也就是説一個ChannelContext可以同時屬於group-a,group-b… …group-n
  • 下面貼一下這4個資源綁定的源代碼
  • /**
  • * 綁定業務id
  • * @param channelContext
  • * @param bsId
  • * @author tanyaowu
  • */
  • public static void bindBsId(ChannelContext channelContext, String bsId) {
  • channelContext.tioConfig.bsIds.bind(channelContext, bsId);
  • }
  • ``
  • /**
  • * 綁定羣組
  • * @param channelContext
  • * @param group
  • * @author tanyaowu
  • */
  • public static void bindGroup(ChannelContext channelContext, String group) {
  • channelContext.tioConfig.groups.bind(group, channelContext);
  • }
  • ``
  • /**
  • * 綁定token
  • * @param channelContext
  • * @param token
  • * @author tanyaowu
  • */
  • public static void bindToken(ChannelContext channelContext, String token) {
  • channelContext.tioConfig.tokens.bind(token, channelContext);
  • }
  • ``
  • /**
  • * 綁定用户
  • * @param channelContext
  • * @param userid
  • * @author tanyaowu
  • */
  • public static void bindUser(ChannelContext channelContext, String userid) {
  • channelContext.tioConfig.users.bind(userid, channelContext);
  • }

業務數據解綁

  • 既然有綁定,就肯定會有解綁,這是個和綁定相反的操作,所以話不多説,直接貼出不長的源代碼
  • /**
  • * 解綁業務id
  • * @param channelContext
  • * @author tanyaowu
  • */
  • public static void unbindBsId(ChannelContext channelContext) {
  • channelContext.tioConfig.bsIds.unbind(channelContext);
  • }
  • ``
  • /**
  • * 與所有組解除解綁關係
  • * @param channelContext
  • * @author tanyaowu
  • */
  • public static void unbindGroup(ChannelContext channelContext) {
  • channelContext.tioConfig.groups.unbind(channelContext);
  • }
  • ``
  • /**
  • * 與指定組解除綁定關係
  • * @param group
  • * @param channelContext
  • * @author tanyaowu
  • */
  • public static void unbindGroup(String group, ChannelContext channelContext) {
  • channelContext.tioConfig.groups.unbind(group, channelContext);
  • }
  • ``
  • /**
  • * 解除channelContext綁定的token
  • * @param channelContext
  • * @author tanyaowu
  • */
  • public static void unbindToken(ChannelContext channelContext) {
  • channelContext.tioConfig.tokens.unbind(channelContext);
  • }
  • ``
  • // org.tio.core.TioConfig.ipBlacklist
  • ``
  • /**
  • * 解除channelContext綁定的userid
  • * @param channelContext
  • * @author tanyaowu
  • */
  • public static void unbindUser(ChannelContext channelContext) {
  • channelContext.tioConfig.users.unbind(channelContext);
  • }
  • ``
  • /**
  • * 解除userid的綁定。一般用於多地登錄,踢掉前面登錄的場景
  • * @param tioConfig
  • * @param userid
  • * @author: tanyaowu
  • */
  • public static void unbindUser(TioConfig tioConfig, String userid) {
  • tioConfig.users.unbind(tioConfig, userid);
  • }

異步發送

  • 異步發送,指的是業務層把Packet丟給t-io後立即返回,返回時Packet並沒有被髮送,而只是提交到了待發送隊列
  • 異步發送都是以send開頭的,這個API有點多,貼代碼有點長,用圖片展示更舒適些

image.png

阻塞發送

  • 阻塞發送:t-io把Packet送給對方後才返回
  • 阻塞發送都是以bSend開頭的,這個API有點多,貼代碼有點長,用圖片展示更舒適些

image.png

如何獲取ChannelContext

  • 前面的業務數據綁定,一個重要的目的就是要根據那些業務標識來獲取ChannelContext,譬如你綁定了一個userid,那麼後面就可以通過這個userid來獲取ChannelContext

  • 獲取ChannelContext的API都是以get開頭的,這個API有點多,貼代碼有點長,用圖片展示更舒適些

image.png

斷開連接和移除連接

  • 斷開連接都是以close開頭的方法,指的是把當前已經連上的TCP連接斷開掉

image.png - 移除連接都是以remove開頭的方法,指的是徹底拋棄這個連接

image.png

注意

  • 如果是用t-io做TCP服務器端

    • 上面兩個方法是等價的,因為服務器不存在重連一説
  • 如果是用t-io做TCP客户端,並且沒有配置重連

    • 上面兩個方法也是等價的,因為不需要重連,tio斷開連接後就會釋放該連接全部資源
  • 如果是用t-io做TCP客户端,並且配置了重連規則,上面兩個方法才是有區別的,區別如下

    • close(): 不釋放相關資源,並且會進行重連
    • remove():完全釋放相關資源,不再進行重連

    集羣通知

    • t-io是內置集羣功能的,作為與業務不相關的io框架,內置集羣功能是件費力卻不見得討好的事(為啥不討好?譬如會增加代碼複雜度、會降低tio-mvc在TFB上的跑分排名),但t-io考慮到廣大用户的呼聲,還是內置了集羣功能
    • 目前t-io提供的消息發送功能,都是支持集羣的,這個從Tio.java的源代碼中就能看出來
    • 集羣通知類API都是以notifyCluster開頭的,見圖

image.png

t-io拉黑IP

簡單到極致,只需要一行代碼 1. Tio.IpBlacklist.add(tioConfig, channelContext.getClientNode().getIp());