?

基于Select多路復用的游戲服務端框架研究與實現

2020-09-24 08:31章國雁
黃山學院學報 2020年4期
關鍵詞:服務端客戶端框架

章國雁

(安徽工商職業學院 信息工程學院,安徽 合肥230001)

一、引 言

網絡游戲(Online Game)是指由軟件程序和信息數據構成,通常以客戶端、網頁瀏覽器和包括移動電話、聯網游戲機等各類信息設備的其他移動終端為載體,以游戲運營商服務器為處理器,以互聯網為數據傳輸媒介的游戲產品及服務[1]。網絡游戲依據載體的不同,包括基于普通PC 機的端游、基于瀏覽器運行的頁游、基于XBOX、PS4等的主機游戲、基于手機/iPad等移動設備的手游。其中,端游由于運行在PC 機平臺上,該種類游戲一般制作較為精良,畫面效果較好,受眾玩家對游戲的要求也更高一些;頁游主要運行在瀏覽器上,直接打開即可運行游戲,該種類游戲往往畫面效果較為一般,但由于不用下載游戲文件,打開網頁可直接開始玩,較為便捷,受眾群體多為對游戲畫面和玩法要求不高的玩家;主機游戲的畫面效果最好,制作最為精良,但要求有配套的主機設備,游戲操作對玩家的專業性要求也更高;手游受益于近些年手機和iPad等移動端用戶的大量增加,該種類游戲玩法和畫面效果好于頁游,較好地利用了用戶的空余間隔,玩法較為簡便,是目前為止發展較好的類別。

二、服務端關鍵技術

1.網絡協議

網絡協議是保障網絡游戲基本通信的前提,合理地選擇網絡協議將使游戲更加高效、穩定和安全[2]。傳輸控制協議(TCP)和用戶數據報協議(UDP)是網絡游戲研發中常用的兩個協議。

傳輸控制協議作為一種面向有連接的協議,位于傳輸層,服務可靠性非常高,為了便于傳輸,將大塊的數據包以報文段為單位進行分割,方便數據管理。傳輸控制協議之所以擁有可靠性,是該協議能夠把數據無誤地傳到對方,針對丟包可以進行重發,對次序錯誤的數據包進行順序調整;還具有控制通信流量的功能,發送數據前先確認通信對方是否存在,不存在不會發送數據。通常傳輸控制協議連接會有三次“握手”建立,斷開連接要經過四次。

用戶數據報協議是無連接、不可靠的協議,發送數據前不確認通信對方是否存在,直接把數據發送到網絡中,因此并不能確認該數據是否到達終端節點,也不能確認數據到達的順序是否正確。

2.Socket(套接字)

Socket(套接字)由端口號拼接IP 地址構成,它是傳輸層實現端到端通信的一個端點,每一次連接都有兩個端點,套接字表示形式為主機IP 地址:主機16位端口號。假設一個IP地址為202.57.134.29,端口號為85 的主機,那么其套接字形式為(202.57.134.29:85)。

3.I/O模型

Select 模式是 Winsock 中最常見的 I/O 模型[3]。它主要是使用select 函數來實現對I/O的管理,并判斷套接字上是否能寫入或者存在數據[4]。當系統內核檢測到進程的1個或者多個I/O條件準備完畢時,Select 多路復用模式會通知該進程。該模型的優點在于減少了系統開銷,系統不必頻繁創建和維護大量的進程或者線程。

4.分布式數據庫

現在網絡游戲功能復雜,玩家需要存儲大量的數據,除了基本的用戶賬號、密碼等信息外,還有游戲角色相關的大量數據需要在數據庫中長期保存。由于網絡游戲對畫面傳輸的同步性要求較高,如果數據庫采用同步的模式,網絡延遲較大??梢允褂梅植际綌祿?,采用異步的方式對數據庫進行操作。

三、通用服務端框架設計

游戲服務端主要任務是接收和處理游戲客戶端發送過來的大量信息,以及存儲和讀取玩家賬號角色相關的數據,依據這一任務內涵,一款通用的小型網絡游戲服務端框架可以按圖1 方式實現,采用Select 多路復用服務端架構,“網絡底層”模塊位于架構的底層,主要功能為處理數據粘包半包、協議解析等,主要代碼封裝在NetManager 類中進行實現;“消息處理”模塊屬于架構的邏輯層,如客戶端向服務端發送“移動”協議時,服務端在該模塊中記錄玩家的位置信息,然后把“移動”協議廣播給所有在線的客戶端,其他客戶端收到信息后根據最新的數據更新其對應玩家的位置;“事件處理”模塊主要處理玩家的上線和下線操作,玩家新上線時,首先需要讀取數據庫中保存的數據,然后初始化角色信息,當玩家下線時,需要保存玩家的最新數據到數據庫中等?!皵祿斓讓印蹦K包含游戲數據的新增、讀取、修改、刪除等功能,例如賬戶登錄時密碼的校驗、新玩家注冊時賬戶名的重復性檢測、玩家數據(如等級)的讀取等,是服務端和數據庫本身數據通信的中介?!按鎯μ幚怼蹦K主要是區分數據的存儲形式,游戲中有些數據,如玩家等級、金幣、裝備、經驗值等需要長期保存,有些則可以臨時保存。

該框架在網絡帶寬較好地情況下,可承載1 萬名左右玩家同時在線游戲,可保持較好的游戲體驗。該服務端框架采用TCP 協議進行通信,使用Json 進行通信編碼,使用MySQL 數據庫保存玩家數據。

圖1 服務端框架

四、通用服務端框架實現

服務端程序具有粘包半包處理、協議解析、心跳機制、數據庫存儲等功能。

1.網絡管理器NetManager功能

服務端框架中“網絡底層”模塊的核心部分主要實現創建監聽套接字listenSocket、管理客戶端狀態列表checkReadList、綁定、開啟端口監聽(服務器啟動成功)、Select 多路復用檢測可讀對象、新客戶端連接處理ReadListenSocket、客戶端消息處理ReadCliendfd、定時器等功能,服務端進入StartServerLoop循環狀態,其核心代碼如下:

2.協議解析

采用Json 編碼解碼,其格式簡介、層次結構清晰,不但便于人去閱讀和編寫,也便于機器去解析和生成,采用Json 編碼的方式可以提升網絡數據的傳輸效率。

.net 內置了編碼解碼Json 的方法“JavaScriptJ-sonSerializer”,需要手動引用System.web.Extensions命名空間。Json編碼解碼的代碼如下:

3.心跳機制

如果客戶端掉線或者信號不好導致網絡斷開,服務端應該能及時發現并釋放資源,對單個客戶端來說,資源的釋放作用不是很明顯,因為單個客戶端只有一個Socket 占用資源,而對服務端來說卻是連接著幾萬甚至幾十萬的資源,如果不能主動釋放斷開的資源,將造成服務端資源被大量占用。

心跳機制用于避免出現類似的情況,TCP 協議本身具有心跳機制,但需要等待2 小時才會釋放資源,這對網絡游戲來說,顯然是不適用的,因此目前業內主要是自行實現心跳機制,客戶端在固定時間間隔給服務端發送PING 協議,服務端在固定時間間隔收到后響應發送PONG 協議;假設服務端在設定時間間隔內因為網絡不順暢或者客戶端掉線沒有收到PING 協議,則可以判斷客戶端已經掉線,釋放回收該資源用于其他客戶端;同樣,假設客戶端較長時間內沒有收到PONG 協議,則認為網絡斷開或者服務端已經宕機,客戶端可以釋放自身的資源。

4.數據庫存儲

網絡游戲中的數據量十分龐大,玩家數據有些必須在數據庫中進行長期存儲,有些只需要臨時存儲即可,例如用戶賬號和密碼、玩家的金幣、等級、裝備種類、任務等,這些信息時刻受到玩家關注,需要長期存儲,方便玩家上線后進行數據調用;但有些數據,例如玩家的當前位置信息只需臨時存儲,玩家重新上線后會被重置。在Player對象中設定一個PlayerData 類型的對象,用來保存所有需要存儲到數據庫的信息,以昵稱、金幣、等級三個屬性為例。代碼如下:

游戲開發中使用最多的是MySQL數據庫,當服務端與數據庫需要進行數據交互時,通過發送SQL語句進行數據的操作,包括新增、修改、讀取、刪除等操作。配置MySQL數據庫分為兩個步驟,一是安裝MySQL 服務器,開始監聽端口;二是使用第三方庫來編碼和解碼MySQL 特定形式的協議。采用Navicat 軟件來進行數據庫管理,新建數據庫名為“game”,新建“account”表和“player”表,如圖2所示。

圖2 MySQL數據庫表

五、服務端運行及測試

服務端框架搭建成功后,如圖3 所示,連接成功,服務端啟動,開始對服務端進行監聽,客戶端使用Unity3D游戲引擎進行功能測試,客戶端連接、賬號注冊、登錄、心跳機制、客戶端斷開等功能正常運行。

六、結束語

圖3 服務端測試

基于Select多路復用的通用服務端框架是一套功能較為完備的C#通用服務端程序,可用于小規模同時在線,為網絡游戲服務端開發商業應用提供了一定的技術參考。

猜你喜歡
服務端客戶端框架
你的手機安裝了多少個客戶端
你的手機安裝了多少個客戶端
有機框架材料的后合成交換
框架
如何看待傳統媒體新聞客戶端的“斷舍離”?
新時期《移動Web服務端開發》課程教學改革的研究
關于原點對稱的不規則Gabor框架的構造
我國在WYO框架下面對的貿易保護現狀及應對
新華社推出新版客戶端 打造移動互聯新聞旗艦
摸清黑客套路防范木馬侵入
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合