muduo網路庫使用心得
上個月看了朋友推薦的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資料收發和處理。
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資料收發和處理。
相關文章
- muduo網路庫Timestamp類
- muduo網路庫Exception異常類Exception
- muduo網路庫編譯安裝編譯
- muduo網路庫學習之muduo_http 庫涉及到的類HTTP
- muduo網路庫學習之muduo_inspect 庫涉及到的類
- muduo網路庫AtomicIntegerT原子整數類
- muduo網路庫學習筆記(1):Timestamp類筆記
- muduo網路庫學習筆記(2):原子性操作筆記
- muduo網路庫學習筆記(3):Thread類筆記thread
- muduo網路庫學習之EventLoop(七):TcpClient、ConnectorOOPTCPclient
- muduo網路庫學習筆記(14):chargen服務示例筆記
- muduo網路庫學習筆記(11):有用的runInLoop()函式筆記OOP函式
- muduo網路庫學習之EventLoop(一):事件迴圈類圖簡介和muduo 定時器TimeQueueOOP事件定時器
- muduo網路庫學習筆記(12):TcpServer和TcpConnection類筆記TCPServer
- muduo網路庫學習筆記(13):TcpConnection生命期的管理筆記TCP
- muduo網路庫學習筆記(10):定時器的實現筆記定時器
- muduo網路庫學習筆記(7):執行緒特定資料筆記執行緒
- muduo網路庫學習之EventLoop(四):EventLoopThread 類、EventLoopThreadPool 類OOPthread
- muduo網路庫學習筆記(15):關於使用stdio和iostream的討論筆記iOS
- muduo網路庫學習筆記(9):Reactor模式的關鍵結構筆記React模式
- muduo網路庫學習筆記(8):高效日誌類的封裝筆記封裝
- muduo網路庫學習筆記(4):互斥量和條件變數筆記變數
- muduo網路庫學習筆記(5):執行緒池的實現筆記執行緒
- muduo網路庫學習之EventLoop(六):TcpConnection::send()、shutdown()、handleRead()、handleWrite()OOPTCP
- muduo網路庫學習筆記(6):單例類(執行緒安全的)筆記單例執行緒
- muduo網路庫學習之ThreadLocal 類、ThreadLocalSingleton類封裝知識點thread封裝
- muduo網路庫學習之EventLoop(二):程式(執行緒)wait/notify 和 EventLoop::runInLoopOOP執行緒AI
- muduo網路庫學習之EventLoop(五):TcpConnection生存期管理(連線關閉)OOPTCP
- muduo網路庫學習之Timestamp類、AtomicIntegerT 類封裝中的知識點封裝
- GitHub使用心得——倉庫建立Github
- muduo網路庫學習之EventLoop(三):Socket、Acceptor、TcpServer、TcpConnection(連線建立,接收訊息)OOPTCPServer
- muduo
- muduo網路庫學習之BlockinngQueue類、ThreadPool 類、Singleton類封裝中的知識點BloCthread封裝
- 圖神經網路7日打卡心得神經網路
- muduo網路庫學習之MutexLock類、MutexLockGuard類、Condition類、CountDownLatch類封裝中的知識點MutexCountDownLatch封裝
- 你憑什麼做好網際網路 --讀書心得
- Django 使用心得 (四)多資料庫Django資料庫
- 無線網路技巧:WiFi故障處理心得WiFi