** //
最近一段時間不是很忙,就寫了乙個自己的遊戲伺服器框架雛形,很多地方還不夠完善,但是基本上也算是能夠跑起來了。我先從上層結構說起,一直到實現細節吧,想起什麼就寫什麼。
第一部分 伺服器邏輯
伺服器這邊簡單的分為三個部分,客戶端的連線首先到達閘道器伺服器,閘道器這裡有個執行緒用來監聽來自與客戶端的連線,然後在將這些資料傳送到遊戲邏輯伺服器上,這個邏輯遊戲伺服器上,資料的互動就是通過與資料伺服器進行互動。recordserver專門用來處理與資料庫的連線,查詢這些事情。當然為了遊戲伺服器能夠最大程度的不卡,肯定就得規定好閘道器伺服器上的連線數量,免得像我們號稱流暢的鐵道部訂票網路一樣做個卡b,想想玩一局dota被卡的悲劇吧。當我們要做乙個大型網遊時,這三個伺服器顯然不夠。當然在自己寫的小遊戲的時候就無所謂了,幾個伺服器全部架設在自己的破筆記本上,不就是啟動幾個程式而已。
這個感覺寫得就差不多了,到細節吧。
第二部分 實現細節
這個就比較亂了,零零散散的,隨便寫了。這裡很多都是對各種工具的封裝,以便於自己 在專案的使用
1.make
專案這麼多目錄,這麼多子目錄,肯定得用工具去編譯了,使用aclocal,automake,autoconf,make,就把我們的程式編譯好了,編寫自己configure.in檔案,定義編譯選項、鏈結庫等等一系列亂七八糟的東西,然後對每個需要編譯的子專案編寫makefile.am,有的需要要編譯成庫的,比如base等基類這些,其他的都編譯成可執行檔案了,gatewayserver,logicalserver,recordserver。
2.套接字封裝,epoll使用
linux裡,我們使用socket來讀寫網路上的資料,這個很簡單了,gateway上乙個客戶端連線過來,我們就為它分配乙個socket 描述符了,在閘道器上,乙個執行緒用來accept,乙個執行緒用來做資料的處理,當accept乙個連線請求後,放到資料處理的執行緒,接受到乙個資料,然後直接**到logical server上,我們使用epoll_wait,來處理套接上的讀寫處理。每n ms處理一次迴圈,每次迴圈中使用一次epoll_wait,一次把這些有事件的socket取出來。
3.資料加密解密,壓縮解壓
對網路上的資料,為了保證安全性,必須對它們進行加密解密處理,這個簡單了,網上各種內容,這裡就不說了(全部寫完了,有時間再寫)。對資料進行壓縮,能減少頻寬吞吐,就是簡單的呼叫幾個zlib函式的呼叫,不細說,在前面**的《zlib使用》中有講,發現自己太懶,實在是懶得打字了。
4.執行緒封裝,互斥量,讀寫鎖
這些都是簡單的使用raii或其他方式,對這些東西進行一次本地封裝。(應該得寫乙個執行緒池去管理這些執行緒,todo)
5.資料庫封裝
使用mysql,使用mysql的c api函式,這個必須得封裝一下,不是每次資料的處理,都得去做很多事情,實現乙個本地的資料的field(列),record(記錄),table(表),database(資料庫),recordset(查詢結果集)。製作乙個資料庫連線控制代碼mysqlhandle,處理對資料庫的連線,處理等,實現乙個handlerpool,,每次從pool中取出乙個控制代碼來對資料庫進行查詢,免得每次都去重新連線,什麼的。
6.自己的記憶體池
在之前分享的文章中《記憶體池技術詳解》《編寫自己的記憶體分配器》,自己的《記憶體池應用》,已經很詳細的說明了,記憶體池的製作,當然我在這裡還是有一些改動的,但是大概思路就是這些了。
7.有乙個狀態機的實現
這個也在自己之前寫的那個狀態機相關的文章裡,也做記錄了。哈哈,實在是不想繼續碼字了,但是還是堅持下去。
8.lua與c++互動框架
這個暫時寫了一半,等全部完成了,再來弄,反正就是像npc處理這些,指令碼處理這些,使用tolua++。
9.tinyxml封裝,正規表示式封裝
tinyxml乙個輕量級的xml解析器,很簡單,反正是把這些現成的東西拿來自己用。正規表示式沒有進入c++標準,但是還是很多現成的正規表示式的處理,直接用linux庫下的regex.h,就是編譯正規表示式,匹配結果這些,
10.log系統
乙個專案怎麼能沒有自己的日誌系統呢,反正就是打日誌,往檔案裡面寫東西,用std::fstream輕鬆搞定,定義好日誌級別:error / debug / fatel / info這些
11.時間封裝
這個必須有,否則自己還每次去呼叫get_clocktime,gmtime,time各種函式呀。
12.使用boost庫里的,noncopyable,singleton這些設計方法,來寫我們的**
13.定義好各種訊號控制代碼,訊號發生時採用什麼策略,如sigpipe,做忽略處理
待續。。。。。。。。(睡覺了)
遊戲伺服器技術應該算來已經很成熟了,相比客戶端,它的技術更新速度很慢了。客戶端這邊,技術很多,各種遊戲引擎比如3d的虛幻這些,什麼粒子引擎,聲音這些,頁遊的flash, html5,utility,,太多了,搞不過來呀。我先把伺服器這邊好好專專,其他的等以後再說吧。
伺服器基本框架
模組單個伺服器程式 伺服器機群 i o處理單元 處理客戶鏈結,讀寫網路資料 作為接入伺服器,實現負載均衡 網路儲存單元 本地資料庫 檔案或快取 資料庫服務 請求佇列 各單元之間的通訊方式 各伺服器之間的永久tcp連線 請求佇列是各單元之間的通訊方式的抽象,通常被實現為池的一部分。對於伺服器機群而言,...
乙個超級簡單的伺服器框架
1.本伺服器端框架採用epoll 執行緒池 任務佇列 2.epoll和sernasock是我封裝的,threadpool用的是 epoll.h by gzh 2017.12.12 可以改進的地方 epollin 接收資料read 處可以優化,現在每次可以接收1kb的資料 ifndef gzh epo...
乙個超級簡單的伺服器框架
1.本伺服器端框架採用epoll 執行緒池 任務佇列 2.epoll和sernasock是我封裝的,threadpool用的是 epoll.h by gzh 2017.12.12 可以改進的地方 epollin 接收資料read 處可以優化,現在每次可以接收1kb的資料 ifndef gzh epo...