一個可屏蔽長短連接的網絡模塊

前言

遊戲開發中最複雜的模塊,沒有之一。其實我也不想寫這篇文章,怎奈框架代碼賣出去了,得給個人用戶一個交代。
網絡模塊都須要實現哪些功能呢?按我以往的開發經驗總結以下:服務器

  1. 消息的正常發送與接收
  2. 長連接的斷線重連
  3. 消息發送失敗與嘗試
  4. 長連接的心跳處理
  5. 適應各類服務器定義的協議格式
  6. 適應各類數據傳輸格式
  7. 屏蔽長短連接的差別
  8. 長連接支持發送協議號與接收協議號不一樣的狀況。
  9. 讓短連接也能夠像長連接同樣更新數據。

有必要屏蔽長短連接嗎?

這個看需求吧
有沒有開發過程當中將長連接改爲短連接的狀況呢?你客戶端不支持,服務器但是支持的。
若是一個團隊有不少開發人員,做爲主程的你是否要屏蔽底層邏輯,提供統一的調用接口給其餘開發人員使用呢?
若是你一我的作一款遊戲,你就隨便來吧,隨便什麼樣的方式只要你開心就好。微信

類圖

image.png

  1. Service 實現ServiceInterface接口負責屏蔽連接類型
  2. Message 負責封裝發送和接收的消息。
  3. MessageHander 負責編解碼處理。
  4. ServiceInfo 保存服務器信息。例如 ip 端口,協議號映射等信息。
  5. RemoteProxy 負責調用Service發送消息,接收Service返回的消息並經過事件派發給監聽者。

關鍵代碼

  1. ServiceInfo
    image.png
  2. ServiceInterface
    image.png
  3. Service
    image.png
  4. MessageHandler
    image.png
  5. Message
    image.png
  6. RemoteProxy
    image.png

如何使用呢?

  1. 定義一個類來處理連接的監聽
    image.png
  2. 定義一個地址和開發環境相關的數據類
    image.png
  3. 實現編解碼處理類
    image.png
  4. 定義協議號常量類
    image.png
  5. 定義一個連接
    image.png
  6. 使用方式
export default class LoginController extends LogicController {

    constructor(){
        super(LoginProxy.instance());
    }

    private static ins:LoginController;

    static instance():LoginController{
        if(!this.ins){
            this.ins = new LoginController();
        }
        return this.ins;
    }

    //註冊協議號與回調函數
    getProtoList(){
        return [
            [NetConfig.OPEN,this.netOpen],
            [LoginProtocolIDs.LOGIN,this.loginRsp],
        ];
    }

    netOpen(){
        cc.log(' 連接成功 ')
        this.pushView('Prefab/LoginView','LoginView',null,ModuleManager.getLoader(),UIIndex.STACK)
    }
    //進入模塊 先連接服務 固然也能夠先彈出界面,再推送連接結果。
    intoLayer(){
        ModuleManager.setModuleID(ModuleID.LOGIN)
        //進入此模塊,先進行連接操做,若是連接成功 會走loginRsp 函數
        this.remoteProxy.connect(new ServiceInfo(NetConfig.HTTP,AddressConfig.getAdress(AddressConfig.LOGIN,0)));
    }

    // 點擊登錄按鈕發送請求。
    loginReq(name:string){
        cc.log(" loginReq ",name);
        this.sendMessage(LoginProtocolIDs.LOGIN,{name:name,channel:'crazy'});
    }

    //登錄成功
    loginRsp(msg:ReceiveMessage){
        cc.log(" loginRsp msg ",msg);
        //因爲服務器已經關閉,因此不會被調用,正常內容返回時會走這裏。
    }

}

結語

細節代碼太多了,若是都粘貼上來沒法忍受。其實網絡那些事論壇裏已經有人說的很詳細了。使用方式也不少,就好像都是用xxgl,每一個引擎實現的方式都不一樣。我只是從框架和封裝的角度整理一下具體的使用方式,其實細節的東西,你沒有遇到的時候也是沒辦法理解的,代碼裏都是經驗。有想法的同窗留言吧。網絡

歡迎掃碼關注公衆號《微笑遊戲》,瀏覽更多內容。

微信圖片_20190904220029.jpg

歡迎掃碼關注公衆號《微笑遊戲》,瀏覽更多內容。框架

相關文章
相關標籤/搜索