0%

关于游戏服务端的搭建

  前一阵,一场突如其来的疫情,将我们都困在了家中,于是有了大把的时间,来做一些自己感兴趣的事情。当然,是打游戏咯。
  不过只是打游戏,也太low了,完全不符合我们程序员的气质,我们作为网络世界中的众多缔造者之一,仅仅扮演一个渺小的角色,未免太过无趣。于是,我想到自己搭建服务器给自己玩,做自己的神~哈,开玩笑的,其实是为了更好的了解那些手游端游的运作机制啦,就搭建了几款不同的游戏,也算研究研究 常用架构吧。

准备工作

准备游戏服务架构

  这些天,我下载了很多游戏的服务架构,页游、手游、端游都有。看到里面的配置和架构也都五花八门。总的来说,一般页游大多是AMP+JAVA,手游遇到很多, JAVA+MongoDB,页游AMP+Erlang+RabbitMQ的组合。端游就更加五花八门了,很多引擎或者自制脚本,使用的数据库种类也很多,MongoDB、mysql、SQL Server等等,不同游戏的架构选择都不同。
  因为我们自己肯定没法写出来一个完整的游戏服务包,所以最理想的也是最简便的方法就是使用别人已经写好的现成的服务包,安装配置即可(里面坑巨多,免费分享出来的,完整性和质量就没法苛求了),大部分修复下或者调整下也是能够凑活跑起来的。
  不过倒也遇到很多问题,游戏中有很多bug,例如这个任务流程过不去,那个点了没反应,只能边玩边吐槽;还有个手游架设好后,一直没有报错,就一直没管他,运行3天后,有小伙伴说登录不上,才发现服务器数据库崩掉连接不上了,由于搭建好后就没有关注监控这个服务器,甚至不知道是啥时候崩掉的,也就不知道为什么会崩,重新搭建连接完数据库,之前玩的游戏数据也就清空没有(没有设置实时备份数据库),小伙伴们很是扫兴,还好不是实际生产中,这我也很无奈啊。
  但总体下来,大家反应都是很不错的,毕竟道具无限,人人都是大佬,也算无聊的假期大家一起有共同消遣了。

网络环境

  因为要自己开服务器,如果只是在本地电脑上配置,那其他小伙伴们就没法连接进来,自己游戏里再NP也没人分享可太悲哀了。所以,我们一定要连上外网,需要公网IP,才可以供他人访问。
  博主有一个aws的海外云主机,还有一个腾讯云的国内云主机,虽然直接在云主机上搭建可以直接解决公网IP的问题,不过这俩云主机配置都不高,都是1C1G,担心无法完美支撑服务跑起来(花钱升级配置是不可能的~)。于是初步决定在本地先将服务跑起来,用 你v懂p得n 打通本地电脑和云主机的网络,配置云主机的反向代理,实现游戏服务器公网搭建。做出规划步骤如下

  • 本地搭建游戏服务端
  • 用 你v懂p得n 打通本地主机和云主机的网络
  • 配置云主机的代理转发
  • 修改本地主机的游戏服务监听端口
  • 配置客户端

正式搭建

本地搭建游戏服务端

  因为我搭建了很多不同类型的游戏,且每一种其实方法步骤都不一样,需要的配置和环境也都不同,遇到的问题也不尽相同,在这里就没法一一细说了,会在文末将我搭建成功的那些服务包都贴出来,有需要的小伙伴可以自行研究。

打通网络

  可以参考我之前博客https://hewanyue.com/blog/2c6b894f.html架设 你v懂p得n 。协议可以使用UDP,之前我用TCP总是被封掉。搭建好,建立连接后,其实就已经算是打通网络了。
  在window cmd命令行或者linux的终端里ping 10.8.0.1 就可以ping通云主机了的。然后也可以尝试用云主机验证 访问本地10.8.0.6上面的http服务之类的。

配置云主机反向代理

  虽然这两台机子间是联通了,但是别人访问你的云主机的IP,并不能连接到你本地的服务器主机,所以我们需要在防火墙上配置转发。
  例如本地服务器开启的端口为 12345,而我们想让别人访问云主机的 54321端口就可以登录我们的游戏服务,需要填写dnat 还有地址伪装。代码如下:

1
iptables -t nat -D PREROUTING -d 0.0.0.0 -p tcp --dport 54321 -j DNAT --to-destination 10.8.0.6:12345

  如果客户端设置的链接协议是UDP,那就将tcp改为UDP,若是不知道客户端程序写的链接方式到底是什么,可以写两条将这俩都转发了。不过如果不写协议会报错的。

1
2
3
[root@ip-172-31-39-115 ~]# iptables -t nat -D PREROUTING -d 0.0.0.0 --dport 54321 -j DNAT --to-destination 10.8.0.6:12345
iptables v1.8.2 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.

  如果不想改不同的端口,倒也可以简单粗暴的,将访问云主机的所有数据统统转发到本地,但这样的话,云主机的其他功能就都会受到影响,不建议这样(云主机上没有其他服务倒也可以这样)。
  还有记得防火墙开启转发功能,否则可能服务器的内网网卡收不到数据报文。

1
2
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

  有的游戏,本地服务器还配有网站等等例如gm简易工具,需要我们在外网也能访问。可以设置nginx或者apache的反向代理转发,比较简单,这里就不细说了。

修改本地主机的游戏服务监听IP端口

  出于安全考虑,很多游戏服务配置的时候,相互之间都是,配置了访问权限的,我下载的大部分游戏都是监听在本地127.0.0.1回环网卡的,如果我们不修改监听地址,从我们构建来的专线的访问数据是没有权限访问我们的服务的,所以我们需要将监听地址修改为10.8.0.6专线网卡的ip上。或者改为0.0.0.0(不建议,有可能端口冲突,造成服务起不来或者报错)。
  一般php或者数据库那些地址就不用改了,因为还是从本地读取的。到时候捋一捋就可以确保正确连接了。

配置客户端

  因为一般需要连接的服务器IP端口,都是写死在客户端中的,我们修改了服务器的地址,所以还要在客户端中修改为正确的ip地址端口,才可以链接(页游不用,页游没有客户端)。
  不同游戏修改方式和路径都不相同,安卓端可以用APKIDE,苹果ipa的可以直接将后缀改为rar,解压后修改对应ip,这里就不细说了。欢迎就具体游戏来讨论。

附本人搭建测试成功的游戏及网盘分享

  • 手游剑侠情缘
    游戏预览:(随便拍的,手边没有安卓机,用的电脑模拟器)

[video(video-mslzJS9V-1582030113247)(type-youku)(url-https://player.youku.com/embed/XNDU1MTQyNjcwMA==)(image-https://vthumb.ykimg.com/054106015E4BB2DE000001693906AF84)(title-剑侠情缘手游)]

安装vmware的centos虚拟机,里面是java程序。
  下载地址
  剑侠情缘VM一键端
链接:https://pan.baidu.com/s/1D0qOO7XcK2K93BLXCsw-fA
提取码:4371

  很多游戏搭好之后,玩了也还不错,不过忘记保留截图了。还有一些还没上传,等日后再分享。欢迎交流讨论。

------------------------------- The End -------------------------------
It's very nice of you to support me.