muduo網路庫使用心得

工程師WWW發表於2016-04-07
上個月看了朋友推薦的mudo網路庫,下完程式碼得知是國內同行的開源作品,甚是敬佩。下了mudo使用手冊和035版的程式碼看了下結構,感覺是一個比較成熟而且方便使用的網路庫。本人手頭也有自己的網路庫,雖然不敢說是一個多強大的網路庫,但畢竟在外網也穩定運營了幾年,多組同時線上也跑過30w左右,單組伺服器也能跑上w人。做遊戲伺服器幾年的經驗,感覺穩定性才是網遊伺服器最核心最重要的環節,效率還在其次,這也是目前網遊伺服器普遍採用分組架構決定的,從運營的角度來看,有時候一組伺服器即使上限能跑上w人,但運營會強制把上限定位幾k人,這裡面跟遊戲玩法還有運營的手段有關係,就不細說了! 
muduo採用的是基於訊息回撥機制的reactor模式,這也是目前網路庫常用的模式。整個網路庫的使用比較方便,只需要關心幾個tcp事件:tcp連線,收資料,tcp關閉等,這幾個事件分別註冊好回撥函式就可以簡單使用。詳細的使用方法看 陳碩的muduo網路庫使用手冊就可以。
      如果要把muduo結合到一般的遊戲伺服器裡面,則最基本的還需要加入組包和打包,如果是對外通訊則還需要加解密模組。參考的方法如下:
第一步,需要定義一個 gameserver這樣的基類,該類負責做為遊戲tcp服務端(不管是閘道器伺服器或者邏輯伺服器都等都可能需要使用tcp服務端),所以必須包含tcpserver,並把tcp的接受連線和收資料,關閉連線等事件註冊到tcpserver的回撥。
第二步:當tcp連線回撥onconnection之後,需要new一個新的logicsession(該logicsession就是負責處理資料組包和加解密,訊息佇列等的類),可以建立一個tcpconnection指標到logicsession的對映。 當tcp連線回撥onmessage之後,根據tcpconnection鍵值找到logicsession,把資料push到logicsession類
      第三步: logicsession收到資料後,需要定義一個訊息佇列類,例如msgqueqe類,負責把收到的二進位制資料解密組包等操作,並且把組好的包存放到訊息佇列中,以供之後的遊戲邏輯使用。
    完成了以上幾步之後,可以開始幹活了。例如要建立一個遊戲閘道器,則只需要定義一個clientserver類繼承gameserver(定義clientserver的原因是因為每個tcp服務所要做的事情可能都不一樣,所以需要根據自身需求實現自己的子類,例如遊戲閘道器肯定是要統計連線人數等,則需要在clientserver中暴露獲取logicsession個數的介面),並new一個clientserver傳入埠,例如埠20000,則開始偵聽來自20000埠的tcp連線,接收到連線資料後,自動由logicsession處理並儲存到每個連線自己的訊息佇列中。如果遊戲伺服器邏輯是單執行緒的,則接著只需要啟動一個執行緒遍歷所有來自20000埠的logicsession,並且把每個logicsession的訊息佇列pop出來,並且分發到相應的訊息處理模組統一處理。這樣就可以完成一次簡單的從客戶端到遊戲閘道器的tcp資料收發和處理。

相關文章