PHP遊戲伺服器的設計思路

2021-09-25 11:20:14 字數 1137 閱讀 9821

因公司需要,從web後端轉向遊戲開發,於是開始了我的遊戲伺服器開發旅程(棋牌遊戲),想象之中、原以為開發遊戲伺服器是特別難的,其中的演算法與資料、網路的規劃/設計等都是開發web不能想象的,從web中的http協議轉為現如今的tcp長連線協議,可以說完全摒棄以前web中的請求->響應便完成了一次會話,因為tcp是面向連線的協議,所以需要了解網路的三次握手的流程。

伺服器需要做什麼?

1. 提供乙個埠,用於給客戶端進行連線 

2. 保持這個連線,每一次的響應資料都響應到這個客戶機上 

3. 由於防火牆在連線過程中,如果沒有任何操作,它會認為這是乙個不安全的連線,於是伺服器為了保證連線不會被動斷開,間隔一段時間會做相應的心跳檢測 

4. 處理客戶機上的請求,用適當的演算法得到相應的結果,最後分發結果到相應的客戶機上 

基本上伺服器的功能便如此、其餘的根據遊戲的特殊要求做相應的處理

由於伺服器接收資料量大時,傳輸過程中會將客戶機傳的包分解成多次傳送過來,於是伺服器就得定製一套屬於自己的tcp協議,以便完整接收整個資料報。定製協議的規則大體如下(workerman為例/其它類似):

<?php

/** * created by phpstorm.

* user: libing

* date: 2017/9/6

* time: 0:07

*/namespace protocols;

class gameprotocol

$unpack_data = unpack('ntotal_length', $recv_buffer);

return $unpack_data['total_length'];

}public static function decode($recv_buffer)

public static function encode($data)

}?>

此**的意思是將資料報的前14的位元組做為包頭,前4個位元組表示此資料報總長度;接著4個位元組是包頭,表示此資料報是幹什麼的;下4個位元組是包的某種狀態,自己定義;最後2個位元組是遊戲型別,它是哪個遊戲的包。這就是自定義的協議,每次客戶端發來的資料以及伺服器回傳的資料都需要這14個位元組。

大體伺服器流程便是如此

遊戲伺服器架構設計

一 棋牌類伺服器的特點 1,棋牌類不分割槽不分服 一般來說,棋牌遊戲都是不分割槽不分服的。所以棋牌類伺服器要滿足隨著使用者量的增加而擴充套件的需要。2,房間模式 即在同一局遊戲中就是在同乙個房間中,同乙個房間中的人可以接收到其他人的訊息。3,每個房間的操作必須是順 序性 這個特性類似與一般遊戲的回合...

mysql 做遊戲伺服器配置 遊戲伺服器部署

bin bash 小菜鳥 掛機 版本 1.0 遊戲伺服器部署 基礎環境 mysql資料庫svn客戶端需部署才能執行此指令碼 if uid 0 then echo game server install else exit 1 firead p please create the storage ga...

mysql遊戲伺服器快取 遊戲伺服器快取策略

1 什麼是快取 在資料庫與伺服器邏輯之間加入的資料層 2 作用 減少資料庫操作 伺服器使用mysql作為資料庫,mysql每秒鐘併發數量有限,所以我們要減少mysql的操作。3 erlang的快取 erlang 在記憶體中可用 程序字典 gen state ets 儲存變數,理論上三種方式都可以作為...