我用php构建了魔兽世界服务器

     --只为证明php是世界上最好的语言

作为一个魔兽老玩家,最近看着暴雪开了怀旧服,早已寂灭的心又开始躁动不安了,我正式入坑是网易接替九城那会,号称万年TBC, 对于那个时代,用一句话表达就是“我站在暴风城的广场上,听着港口涛声,幻想着诺森德天气多么寒冷…”,你懂的~

那时候刚上大学,对于涉世未深的我来说,魔兽的差点让我变成网瘾少年,直到毕业步入社会,才慢慢淡绝了对魔兽的念想,但无论过去多久,那段在网吧通宵鏖战,跟同学朋友在副本、战场度过无数日子的青春一直烙印在心底深处,永不磨灭!

好了,废话不多说,开始进入正题

———————————————————————————————————————

大家都知道,php作为一门脚本语言,对于没什么基础的人来说比较容易上手,但是很难精通,随着互联网的逐步兴起,php也火热起来,在这种需求的催动下,大量人员涌入到php的开发中来,多年之后,一度让人认为php只能写写网站、脚本、接口,随后而来的就是语言鄙视链,写汇编语言的工程师都鄙视写C语言的工,写C语言的工程师都鄙视写C++的, C++工程师鄙视写Java的和写C#的, Java工程师和C#工程师则相互鄙视,然而,所有的工程师都鄙视PHP工程师,于是这句著名的自嘲式的“php是世界上最好的语言”在互联网圈子流传开来~~

SO, 假定“php是世界上最好的语言”这句话为真,那我们用它来构建一个游戏服务端怎么样?

“真的吗?”

“可以吗”

“真的!”

“可以!”

小打小闹的什么页游啊、棋牌啊直接忽视,来个挑战高的,难度大的!那就魔兽世界吧! 哈哈哈哈哈哈哈哈哈哈~

但是写游戏服务端我们要做些什么呢,我也不知道,我也不敢问啊,让别人知道你想用php写魔兽世界服务端,会招来各种花式嘲讽的!

于是偷偷的装了抓包工具,偷偷的研究起了魔兽世界游戏的逻辑,得出结论,

1魔兽世界服务端需要一个用户登录(authserver)服务器用来处理用户登录鉴权,客户端与服务端使用TCP协议,端口号为3724


2需要一个世界(worldserver)服务器来处理游戏逻辑,包含角色的创建,地图的加载,npc和生物的构建及各种眼花缭乱的物品和技能等等~同样是TCP协议,这里的端口号为8085

第一步: 用php 构建用户登录服务器-AuthServer

我这里采用Swoole扩展(不知道的自行百度)创建了TCP服务监听了本机的3724端口

用户登录服务器主要的逻辑是: wow客户端发送账户信息给服务端,服务端验证账户并告知客户端鉴权结果,结果中包含世界服务器的地址及端口。

偷偷说一句,魔兽的客户端在登录的时候只会发送一些基本信息,并不包含明文密码,而是使用SRP认证

SRP简化后的原理是:

  1. 服务器不保存密码或密码的散列值,防止字典攻击, 而只是保存验证因子(verifier)

  2. 客户端和服务器可以各自计算出一个会话秘钥(session key),其值相同 防止窃听

第二步 构建世界服务器-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/wpcore

谢谢!来!让我们一起说 : php是世界上最好的语言!

我用php构建了魔兽世界服务器,只为证明php是世界上最好的语言相关推荐

  1. Wow魔兽世界服务器搭建详细教程,魔兽世界服务器配置要求

    自从<魔兽世界>国服关服后,很多魔兽老玩家心里都是空落落的,魔兽陪伴了我们十多年,此次关服犹如关上了通往艾泽拉斯大陆的大门. 上帝关上了一扇门,我们也可以自己开扇窗,随着国服关闭,越来越多 ...

  2. 如何在5美元的Raspberry Pi上构建个人开发服务器

    In this article, you'll learn how to build a personal dev server by installing Git, Node.js, Rust, a ...

  3. 魔兽世界 服务器维护,魔兽世界8.0:服务器崩溃紧急维护三小时 网易这次得背大锅!...

    原标题:魔兽世界8.0:服务器崩溃紧急维护三小时 网易这次得背大锅! 魔兽世界8.0版本在8月14日凌晨6点30分准时开启,不知道有多少玩家彻夜难眠,定了不知道多少闹钟,甚至不惜请假.辞职只为了在第一 ...

  4. RHEL4- DNS服务(六)构建DNS缓存服务器

    RHEL4- DNS服务(六)构建DNS缓存服务器   如果要构建DNS缓存服务器其实不是很复杂,只要安装一个系统自带的软件包即可.其实这个软件包,我们在<RHEL4- DNS服务(一)bind ...

  5. linux系统构架ftp,用Linux系统构建高效FTP服务器

    在众多网络应用中,FTP(文件传输协议)有着非常主要 的地位.Internet中一个十分主要 的资源就是软件资源,而各种各样的软件资源大多数都放在FTP服务器中.与大多数Internet服务一样,FT ...

  6. 【转】构建C1000K的服务器(1) – 基础

    原文来自 ideawu 构建C1000K的服务器(1) – 基础 著名的 C10K 问题提出的时候, 正是 2001 年, 到如今 12 年后的 2013 年, C10K 已经不是问题了, 任何一个普 ...

  7. 启动go服务_使用Go构建TCP并发服务器,这种方式原来这么简单

    在Go中构建并发TCP服务器 TCP和UDP服务器无处不在,通过TCP / IP网络为网络客户端提供服务.在本文中,我将解释如何使用Go编程语言开发并发TCP服务器,该服务器返回随机数.对于来自TCP ...

  8. android 加固服务器,Python 脚本构建Android APK 自动加固、打渠道包并上传服务器

    Python 脚本构建Android APK 自动加固.打渠道包并上传服务器 常规流程 打出原始apk 使用乐固工具加固并打出响应渠道包 将生成的渠道包上传对应服务器,生成推广链接 因为每一步都需要人 ...

  9. java centos 缩略图_使用 Nginx 的 image_filter 模块来构建动态缩略图服务器

    原标题:使用 Nginx 的 image_filter 模块来构建动态缩略图服务器 在以前我们实现缩略图机制通常是在当用户上传一张图片后,后端程序会固定将图片生成前端页面需要的不同大小缩略图.不管前端 ...

  10. 【spring authorization server系列教程】(一)入门系列,spring authorization server简介。快速构建一个授权服务器(基于最新版本0.3.0)

    系列文章目录 [spring authorization server系列教程](一)入门系列,快速构建一个授权服务器 文章目录 系列文章目录 前言 一.目前已实现的功能 二.入门,一步一步快速开始构 ...

最新文章

  1. koa2+vue实现登陆以及是否登陆控制
  2. C++ Primer 5th笔记(chap 12 动态内存)shared_ptr
  3. Linux 下搭建 Scala 开发环境
  4. windows 添加开始菜单
  5. ueditor如何设置上传图片的高度宽度_怎么设置天猫主图
  6. 异步重试_异步重试模式
  7. Maze(BFS处理)
  8. Java编译过程(传送门)
  9. CSS里各种垂直水平居中方式的基础用法
  10. 源码方式安装最新版本snmp的过程
  11. linux多媒体功能,Ubuntu 8.04中文强化版 多媒体功能更强大
  12. 命令行编译并运行JAVA
  13. 这5款电影资源网站,让人第一眼就心动,第二眼就流连忘返!
  14. c语言圆周长面积公式,怎么用c语言计算圆周长和面积
  15. JavaWeb项目监听数据表变化并通知前台(数据来源于自身)
  16. 【FPGA】实战之按键消抖
  17. 【ORB-SLAM】原理部分
  18. 接口测试介绍以及实践超详细篇
  19. 火山视窗文件框基本操作介绍
  20. Lumerical官方案例、FDTD时域有限差分法仿真学习(九)——布拉格光栅(Bragg gratings)

热门文章

  1. 网络教育本科统考计算机和英语作文,远程教育本科统考英语真题及答案
  2. mac os x excel 单元格换行
  3. 三十岁仍一事无成,一个失败工程师的自白
  4. 协同办公笔记软件综合评测:飞书、语雀、Notion、FlowUs、Wolai
  5. 开源高手推荐 十大最流行开源软件
  6. 太阳直射点纬度计算公式_高中地理——每日讲1题(太阳直射点、太阳高度角、太阳视运动)...
  7. ajax readystate为1,Ajax readyState总是等于1
  8. 计算机组成原理rs rd,计算机组成原理五章.ppt
  9. Functional Code Clone Detection with Syntax and Semantics Fusion Learning论文总结
  10. 数字改造有色金属产业链,发挥产业优势效能