多年前的一款頁遊《傾城》伺服器原始碼分析

2021-09-01 21:35:20 字數 2185 閱讀 2231

未完結版。業務邏輯** 有點看不下去了,於是就放棄了。

1.網路層:

遊戲**中,網路伺服器端

提供了兩套實現,一套是

******netserver

,基於bio

(阻塞io

)的serversocket

;另一套是

nionetserver

,基於nio

(即非阻塞io)

selector

模式的serversocketchannel

。前者應該是用於開發期間的除錯和測試;而後者用於實際生產環境。

比較兩者關閉伺服器的方式,前者是直接中斷執行緒的,比較粗暴;後者是通過設定輪訓欄位字段(

running

)的狀態來關閉的,更優雅、可靠。

其他細節,詳見**。

心跳訊息:

對client

連線,以及收發訊息的操作做了封裝。並有兩個子類繼承之,其中

******connection

對應於******netserver

,是bio

伺服器端的網路連線物件;

nioconnection

對應於nionetserver

,是nio

伺服器端的網路連線物件。

訊息解碼器

/編碼器:

訊息nio

處理流程:

2.資料層

遊戲把資料持久層和資料快取層

合併為同一層了。所以這裡就並為一層來一起講解。

如果非要分資料持久層和

cache

層,dataaccessor

算是主要提供了

cache

的實現。持久層提供了

2種實現:

localfileaccessor

是將使用者資料存放在本地檔案系統中,以文字檔案的形式存在,詳見

localdata\*

或data\*,

貌似data

目錄下的更齊全。目前原始碼中用到的是

localdata

。databaseaccessor

是將使用者資料存放到資料庫中,讀了

gameserver.init()

中提供了

mysql

和mssql

兩種資料庫可選,而配置檔案

config\server.cfg

中配置的是

mssql

資料庫的資料來源資訊,而且還提供了

mssql

的驅動包。

databaseaccessor

中,寫資料庫是非同步的:建立乙個包含

jdbc sql

語句和引數的

job,放入佇列中等待執行。對於插入操作,是先插入

name

,然後獲取資料庫生成的

id,賦值到記憶體中,然後建立乙個

update job

放入非同步佇列中等待更新。

這一層的源**沒有太多可圈可點之處,問題卻是比較多,比如

sql語句硬編碼到源**中,

jdbc

**充斥於各個角落,導致**冗餘且難以維護;資料持久層僅僅使用了單個佇列、單個執行緒處理,在某些情況下風險很高,例如單個

job處理時間過長導致後續

job沒有機會及時執行,尤其是當佇列嚴重阻塞、斷電或宕機時後果最為嚴重;不能充分利用多核

cpu的資源。

一款不錯的伺服器備份軟體支援LINUX

最近,公司要配伺服器,作為技術人員應該做到未雨綢繆,經過努力終於在網海中找到了一款不錯的軟體,個人感覺不錯,功能強大,現在就介紹給大家,acronis true image enterprise server v9.1385 windows 伺服器的即時伺服器磁碟備份,伺服器磁碟影像,與純粹空機還原...

一款免費開源的遊戲伺服器引擎 Scut

oschina原始碼倉庫 國內 api修改說明 scut服務端框架說明 如何搭建scut服務端window開發環境 如何搭建scut服務端linux mac開發環境 如何使用協議工具平台 如何搭建服務端專案工程 如何檢視服務端異常日誌 如何建立http的服務端專案 如何建立websocket的服務端...

一款可以實現協議互轉的串列埠伺服器

一 串列埠伺服器概述 金鴿d224串列埠伺服器,是用於將工業裝置的串列埠資料轉換成乙太網資料的乙個轉換器。d224可以輕鬆的將plc 儀表和感測器等基於rs 232 rs 485和ttl協議的串列埠裝置連線至乙太網中,以便於接入雲平台,也可以讓您的軟體在任何地方都能通過本地區域網或網際網路訪問串列埠...