我用php構建了魔獸世界服務器php
--只爲證實php是世界上最好的語言
做爲一個魔獸老玩家,最近看着暴雪開了懷舊服,早已寂滅的心又開始躁動不安了,我正式入坑是網易接替九城那會,號稱萬年TBC, 對於那個時代,用一句話表達就是「我站在暴風城的廣場上,聽着港口濤聲,幻想着諾森德天氣多麼寒冷…」,你懂的~
那時候剛上大學,對於涉世未深的我來講,魔獸的差點讓我變成網癮少年,直到畢業步入社會,才慢慢淡絕了對魔獸的念想,但不管過去多久,那段在網吧通宵鏖戰,跟同窗朋友在副本、戰場度過無很多天子的青春一直烙印在心底深處,沒法忘懷!git
好了,廢話很少說,開始進入正題
———————————————————————————————————————
你們都知道,php做爲一門腳本語言,對於沒什麼基礎的人來講比較容易上手,可是很難精通,隨着互聯網的逐步興起,php也火熱起來,在這種需求的催動下,大量人員涌入到php的開發中來,多年以後,一度讓人認爲php只能寫寫網站、腳本、接口,隨後而來的就是語言鄙視鏈,寫彙編語言的工程師都鄙視寫C語言的工,寫C語言的工程師都鄙視寫C++的, C++工程師鄙視寫Java的和寫C#的, Java工程師和C#工程師則相互鄙視,然而,全部的工程師都鄙視PHP工程師,因而這句著名的自嘲式的「php是世界上最好的語言」在互聯網圈子流傳開來~~github
SO, 假定「php是世界上最好的語言」這句話爲真,那咱們用它來構建一個遊戲服務端怎麼樣?
「真的嗎?」
「能夠嗎」
「真的!」
「能夠!」服務器
小打小鬧的什麼頁遊啊、棋牌啊直接忽視,來個挑戰高的,難度大的!那就魔獸世界吧! 哈哈哈哈哈哈哈哈哈哈~swoole
可是寫遊戲服務端咱們要作些什麼呢,我也不知道,我也不敢問啊,讓別人知道你想用php寫魔獸世界服務端,會招來各類花式嘲諷的!
因而偷偷的裝了抓包工具,偷偷的研究起了魔獸世界遊戲的邏輯,得出結論,session
1魔獸世界服務端須要一個用戶登陸(authserver)服務器用來處理用戶登陸鑑權,客戶端與服務端使用TCP協議,端口號爲3724php7
2須要一個世界(worldserver)服務器來處理遊戲邏輯,包含角色的建立,地圖的加載,npc和生物的構建及各類眼花繚亂的物品和技能等等~一樣是TCP協議,這裏的端口號爲8085併發
第一步: 用php 構建用戶登陸服務器-AuthServer
我這裏採用Swoole擴展(不知道的自行百度)建立了TCP服務監聽了本機的3724端口工具
用戶登陸服務器主要的邏輯是: wow客戶端發送帳戶信息給服務端,服務端驗證帳戶並告知客戶端鑑權結果,結果中包含世界服務器的地址及端口。性能
偷偷說一句,魔獸的客戶端在登陸的時候只會發送一些基本信息,並不包含明文密碼,而是使用SRP認證
SRP簡化後的原理是:
第二步 構建世界服務器-WorldServer
與上面同樣,須要綁定本機的8085端口
小提示: 3724和8085的TCP/UDP已經被暴雪註冊了…簡單說,暴雪註冊了專有的端口號用於專門的戰網通訊以及魔獸世界的通訊。之前你們(數據包)都從一個門(端口)進進出出,如今暴雪大爺有錢了,弄了個專門的門,之後爺走這個門,大家都不準走。牛逼吧!
魔獸客戶端在用戶登陸服務器鑑權成功後就會鏈接到世界服務器,首次接入服務端會向客戶端發起鑑權數據包,其中帶有服務器隨機密鑰,客戶端收到以後根據密鑰和sessionkey計算出client_hash,併發送給服務端,服務端使用相同公式計算出server_hash判斷是否一致
服務端鑑權完成後的全部數據包都將進行加密
先使用hash_hmac對sessionkey生成指定的哈希運算規則數據,
而後根據數據包的Opcode生成數據包頭,而後發送結果給客戶端
客戶端收到鑑權成功結果後,會發送獲取角色信息的數據包,服務端進行處理,獲取角色信息併發送給客戶端
客戶端點擊進入魔獸世界後,發送CMSG_PLAYER_LOGIN操做碼。服務端接收並處理
還挺多的~就不一一詳細寫了
進入魔獸世界後就是這個樣子
完整運行視頻(Swoole創始人韓天峯的微博): https://weibo.com/tv/v/I7Hu7dVxG?fid=1034:4418354417756012
到此一個簡單的魔獸世界服務器就構建完了! 怎麼樣? 哈哈哈,php是否是世界上最好的語言!
不過話說回來,我目前作到的也是一些很基礎的東西,畢竟魔獸世界那麼大,想要一一實現靠一我的或一門語言是不可能的,能夠作和不能作徹底是兩個概念,使用php是比較方便,高效且便捷,可是性能我沒法徹底保證,不過使用swoole和php7以後,這點就不是我去考慮的了,夠用,還能夠!
代碼我已經開源,地址是:https://github.com/fan3750060...
謝謝!來!讓咱們一塊兒說 : php是世界上最好的語言!