我用php搭建了一个魔兽世界的服务器-只是为了证明php是世界上最好的语言作为一个老魔兽玩家,最近看着暴雪开怀旧服,沉寂已久的心又开始躁动起来。我正式入坑是在网易接手九城,号称万年TBC的时候。对于那个时代,一句话表达就是“我站在暴风城的广场上,听着港口的海浪声,想象着诺森德的天气有多冷……”,你懂的~我只是那个时候还在上大学,对于涉世不深的我来说,魔兽世界几乎让我成为了一个网民。一个沉迷的少年,直到毕业走入社会,对魔兽的念头渐渐淡去,但无论过去多久,那段青春在网吧通宵厮杀,与同学朋友在地牢里度过无数个日子而战场,一直烙印在心底深处,忘不了!好了,废话不多说,进入正题——————————————————————————————————————————————大家都知道php作为一种脚本语言,对于没有基础的人来说比较容易,但是掌握起来就比较难了。随着互联网的逐渐兴起,php也开始流行起来。在这种需求的驱使下,大量的人涌入了php的开发,多年以后,人们一度认为php只会写网站,脚本,界面,然后来了语言鄙视链,写汇编语言的工程师鄙视那些写C语言的,写C语言的工程师鄙视写C++的,C++工程师鄙视写Java和C#的,Java工程师和C#工程师互相鄙视,然而,所有工程师都鄙视PHP工程师,所以这个著名的自嘲“php”是世界上最好的语言”在网络圈流传~~SO,假设“php是世界上最好的语言”是真的,我们用它来搭建一个游戏服务器怎么样?“真的吗?然后魔兽世界!哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈~但是我不知道我们是什么非要写游戏服务器,我不敢问,让别人知道你要用php写魔兽世界服务器,会引来各种花式嘲讽的!所以我偷偷安装了包抓包工具,偷偷研究了一下魔兽世界游戏逻辑,得出结论1、魔兽世界服务器需要一个用户登录(authserver)服务器来处理用户登录认证,客户端和服务器使用TCP协议,端口号是37242。需要一个world(worldserver)服务器来处理游戏逻辑,包括角色创建,地图加载,npc和生物构建,以及各种眼花缭乱的物品和技能等等~T他同样是TCP协议这里的端口号是8085。第一步:使用php搭建一个用户登录服务器——AuthServer。这里我使用Swoole扩展(百度不了解)创建一个TCP服务,监听本地3724端口,用户登录服务器的主要逻辑是:wow客户端向服务器发送账号信息,服务器对账号进行验证,并将验证结果通知给客户端,其中包括世界服务器的地址和端口。说实话,魔兽客户端在登录时只是发送一些基本信息,不包含明文密码,而是使用SRP认证。SRP的简化原理是:服务端不保存密码或密码的哈希值以防止字典攻击,只保存验证因子(verifier),客户端和服务端可以计算出一个会话密钥(会话密钥),其值相同以防止窃听。第二步搭建世界服务器——WorldServer同上,需要绑定本机8085端口提示:3724和8085的TCP/UDP已经被暴雪注册了...简单来说,暴雪已经注册了用于专用Battle.net通信以及魔兽世界通信的专有端口号。以前每个人(数据包)进出都从一个门(端口)进出,现在暴雪先生有钱了,他建了一扇特殊的门。以后不准再进这扇门。惊人的!魔兽世界客户端会在用户登录服务器并认证成功后连接到世界服务器。第一次访问服务器时,它会向客户端发送一个认证包,其中包含服务器的随机密钥。客户端收到后,根据key和sessionkey计算client_hash,发送给服务端。服务端用同样的公式计算server_hash来判断是否一致。服务器认证完成后的所有数据包都会被加密。首先使用hash_hmac为sessionkey生成指定的hash。计算规则数据,然后根据数据包的Opcode生成数据包头,然后将结果发送给客户端。客户端客户端点击进入魔兽世界后,发送CMSG_PLAYER_LOGIN操作码。服务器端的接收和处理还是挺多的~就不一一详细写了。进入魔兽世界后,完整的运行视频是这样的(Swoole创始人韩天峰微博):https://weibo.com/tv/v/I7Hu7dVxG?fid=1034:4418354417756012至此,一个简单的魔兽世界魔兽服务器搭建完成!毕竟魔兽世界那么大,不可能靠一个人或者一种语言来一一实现。能做什么和不能做什么完全是两个概念。使用php更方便,高效方便,但是性能我不能完全保证,但是用了swoole和php7之后,这个就不是我要考虑的了,够用了,没问题!代码我已经开源了,地址是:https://github.com/fan3750060...谢谢!来!让我们一起说:PHP是世界上最好的语言!
