一個簡單的游戲服務器框架 .

???????? 最近一段時間不是很忙,就寫了一個自己的游戲服務器框架雛形,很多地方還不夠完善,但是基本上也算是能夠跑起來了。我先從上層結構說起,一直到實現細節吧,想起什么就寫什么。

? ? ? ? ? 第一部分 服務器邏輯

? ? ? ? ??

? ? ? ??

? ? ? ? 服務器這邊簡單的分為三個部分,客戶端的連接首先到達網關服務器,網關這里有個線程用來監聽來自與客戶端的連接,然后在將這些數據發送到游戲邏輯服務器上,這個邏輯游戲服務器上,數據的交互就是通過與數據服務器進行交互。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等等,我都不懂。我先把服務器這邊好好學習一下,其他的等以后再說吧

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444953.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444953.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

游戲登陸流程 .

當公司有很多游戲的時候,那么公司往往會有一個統一的賬號管理平臺,就就像盛大通行證、網易通行證,戰網平臺,這些平臺統一管理游戲的賬號數據。 打個比方,現在我們玩星辰變,那么玩家登陸游戲的時候…

leetcode97 交錯字符串

給定三個字符串 s1, s2, s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。 示例 1: 輸入: s1 "aabcc", s2 "dbbca", s3 "aadbbcbcac" 輸出: true 示例 2: 輸入: s1 "aabcc", s2 "dbbca", s3 "aadbbbaccc" 輸…

算法(27)-最大系列

最大系列1.LeetCode-239 滑動窗口的最大值2.LeetCode-53 連續子數組的最大和3.LeetCode-152 乘積最大的子數組。4.劍指 Offer 14- I. 剪繩子為k個整數段,使各個段成績最大1.dp數學推導1.LeetCode-239 滑動窗口的最大值 窗口由左往右最大值數組Left,和由…

mysql數據庫表的導入導出

MySQL寫入數據通常用insert語句,如 復制代碼 代碼如下: insert into person values(張三,20),(李四,21),(王五,70)…; 但有時為了更快速地插入大批量數據或…

leetcode 33 搜索旋轉排序數組 到處是細節的好題

這個題想了想就會做,只是細節真的能卡死人,找了好久的bug。甚至我懷疑我現在的代碼可能還有錯,只是沒例子測出來。 假設按照升序排序的數組在預先未知的某個點上進行了旋轉。 ( 例如,數組 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1…

多線程中局部靜態變量初始化的陷阱

C當中常常需要一個全局唯一的對象實例,這時候,我們就會想到單件模式。如何實現這一模式?全局變量當然是一個簡單可行的方法,然而,這太丑陋。嗯,其實,丑陋倒也罷了,最嚴重的是它將引誘…

MachineLearning(8)-PCA,LDA基礎+sklearn 簡單實踐

PCA,LDA基礎sklearn 簡單實踐1.PCAsklearn.decomposition.PCA1.PCA理論基礎2.sklearn.decomposition.PCA簡單實踐2.LDAsklearn.discriminant_analysis.LinearDiscriminantAnalysis2.1 LDA理論基礎2.2 sklearn LDA簡單實踐1.PCAsklearn.decomposition.PCA 1.PCA理論基礎 PCA:&…

引用變量和引用數組

前兩天沒事干,重拾C++的一些書籍,翻到引用這,無意寫了些DD: 其實引用和指針有很多相似的地方,又有不同的(太多了,不過說到效率上,比如函數傳參數,我們可以用引用,指針,哪種好呢,引用不必為站再分配空間了,而指針還學要分配4字節的空間給指針變量) 我們知道如何…

leetcode198 打家劫舍

你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。 給定一個代表每個房屋存放金額的…

linux下的RPC

一、概述 在傳統的編程概念中,過程是由程序員在本地編譯完成,并只能局限在本地運行的一段代碼,也即其主程序和過程之間的運行關系是本地調用關系。因此這種結構在網絡日益發展的今天已無法適應實際需求。總而言之,傳統過程調用模式…

算法(28)--矩陣搜索系列

矩陣搜索1.leetcode-200. 島嶼數量2.leetcode-695. 島嶼的最大面積3.leetcode-463. 島嶼的周長4.劍指 Offer 12. 矩陣中的路徑5.leetcode-329. 矩陣中的最長遞增路徑6.leetcode-1091. 二進制矩陣中的最短路徑1.leetcode-200. 島嶼數量 給你一個由 ‘1’(陸地&#…

leetcode213 打家劫舍II

你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第一個房屋和最后一個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚…

linux下安裝boost

以下是在ubuntu 7.10 (內核 2.6.22-14)下安裝的例子: 一、下載最新的 boost 庫,下載地址: http://www.boost.org/users/download/ 二、在適當的位置解壓 boost 庫,推薦把 boost 庫解壓到 /usr/local/ 下: $ cd dowlo…

PaperNotes(4)-高質量圖像生成-CGAN-StackGAN-Lapgan-Cyclegan-Pix2pixgan

cgan,stackgan,lapgan,cyclegan,pix2pixgan1.Conditional GAN1.1簡介1.2網絡結構與訓練1.3特點與用途2.Stack GAN2.1簡介2.2網絡結構與訓練2.3特點與用途3.Lap GAN3.1簡介3.2網絡結構與訓練3.3特點與用途4.Pix2pix GAN4.1 簡介4.2 網絡結構和訓練4.3 特點和用途5.Patch GAN6.Cy…

關于c++的一些案例

之前做項目的時候,有時候會用到位,也就是將一些數據放在二進制里,然后存在數據庫中或者緩存在服務器上,取出來,然后要判斷某位是不是置0或1,然后再將某位置0或1(比如領多個獎勵的 游戲邏輯),之前有點傻,竟然用 << ,>>這些運算符計算,今天翻起以前好久不…

C++(1)--概況、開發工具、hello word

簡介1. 概況2. 開發工具3. mac 寫hello word4. c 基本概念5.兩個數相加代碼分解5.1編譯預處理命令# include5.2輸入輸出庫iostream6.注釋7.編碼規范《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》1. 概況 20世紀70年代&a…

class 和 struct的區別

C中的struct對C中的struct進行了擴充&#xff0c;它已經不再只是一個包含不同數據類型的數據結構了&#xff0c;它已經獲取了太多的功能。 struct能包含成員函數嗎&#xff1f; 能&#xff01; struct能繼承嗎&#xff1f; 能&#xff01;&#xff01; struct能實現多態嗎&…

leetcode206 反轉鏈表

反轉一個單鏈表。 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL 進階: 你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題&#xff1f; 經典題不解釋 /*** Definition for singly-linked list.* public class ListNode…

淺議柔性數組

很多時候,柔性數組應用在了變長結構體中,如: StructPacket {Int state; Int len;

leetcode 152 乘積最大子序列

給定一個整數數組 nums &#xff0c;找出一個序列中乘積最大的連續子序列&#xff08;該序列至少包含一個數&#xff09;。 示例 1: 輸入: [2,3,-2,4] 輸出: 6 解釋: 子數組 [2,3] 有最大乘積 6。 示例 2: 輸入: [-2,0,-1] 輸出: 0 解釋: 結果不能為 2, 因為 [-2,-1] 不是子…