PhotonServer 服务器部署配置

在部署服务器之前先介绍一下客户端与服务器之间的执行流程如下图所示:

enter image description here

首先客户端连接到Master主服务器,他们可以加入游戏大厅,当客户端在主服务器上调用 JoinGame 或 JoinRandomGame 操作时,Master主服务器查找运行着的Game游戏服务器,并返回 IP 地址给客户端。这时他们在主服务器上调用了 CreateGame 操作,这个游戏服务器不是主服务器实际创建的,而是主服务器仅仅选择了最少工作负荷游戏服务器并将 IP 地址给返回客户端

这个过程给读者通过图的方式展示如下:

enter image description here

客户端接收到 IP 地址后会和主服务器断开通过获得的 IP 地址重新链接对应的游戏服务器

下面再介绍一下主服务器也就是 Master Server。

主服务器总是知道哪些游戏服务器是可用的,多少游戏服务器被托管,当前的工作负荷是多少等等。

为此,每个游戏服务器在启动时就要连接到主服务器,主服务器程序包含了一个游戏集合,储存着传入游戏服务器用户。执行流程就是游戏服务器调用 RegisterGameServer 操作连接到主服务器,这样游戏服务器添加到主服务的游戏服务器集合和负载均衡器中,当断开游戏服务器与主服务器链接时它将被移除。

换句话说,Master Server 跟 Game Server 是一对多的关系,Master Server 能起到负载均衡的作用。再介绍 GameServer 服务器,当客户端从主服务器接收到游戏服务器的地址时,客户端可以在游戏服务器上调用任意可用的操作,唯一不同的是在游戏服务器上我们有单独的操作函数 JoinGame 和 CreateGame。一旦客户端与游戏服务器的连接被建立,游戏服务器将在主服务器上调用 Register 操作,做一个注册操作,让主服务器知道游戏服务器的信息。也就是说,游戏服务器将公布所有的游戏状态到主服务器上。

当然,在游戏被用户创建、加入、离开或者属性被更改时,游戏状态就会被更新到主服务器上。那么主服务器是如何决定哪个游戏服务器处理新的 CreateGame 请求(实际的负载均衡算法)?

游戏服务器定期报告他们当前的工作负荷到主服务器,这工作负荷包括:CPU 的使用、带宽的使用等等。具体执行是主服务器会在 LoadBalancer 类中储存了每个游戏服务器的负载水平,它还附加处理一个包含所有目前最低负荷水平的服务器的列表。任何时候一个客户端调用 CreateGame 操作时,主服务器会从 LoadBalancer 中获取一个最低负荷的服务器地址返回给客户端并连接到服务器。

以上是讲的关于服务器核心模块以及执行流程的介绍,接下来介绍 Photon 服务器部署。

Photon 服务器部署

首先我们去 PhotonEngine 的官方网站下载 PhotonServer SDK,下载网址详见这里

下载后安装,它的安装会将文件解压到一个文件夹中,内容如下:

enter image description here

文件夹中包含的内容介绍如下:

  • deploy:部署程序
  • doc:文档
  • lib:存放类库,在接下来的客户端(Unity3D)和服务器端开发需要引用到
  • src-server:Demo 源码

把核心的内容先给读者介绍,先打开 Deploy 文件夹,再打开 Loadbalancing 文件夹里面有两个文件夹,Loadbalancing 文件夹中的内容涉及到负载均衡操作:一个是 Master,一个是 Game Server;我们在部署 GameServer 注意事项:

你需要确保游戏服务器可以注册到主服务器上,在文本文件 Photon.LoadBalancing.dll.config 中设置 MasterIPAddress 为主服务器的公共 IP 地址。

我们还需要确保游戏客户端可以到达游戏服务器,在每个游戏服务器上,你需要设置公共的 IP 地址,因为客户端要链接游戏服务器的。这里面就有个问题,如果你两个游戏服务器放在一个服务器上,要注意了,因为各个游戏服务器的 IP 地址是不同的。

接下来介绍部署 Master Server 主服务器注意事项:

要确保你的游戏服务器和客户端使用的 IP 可以连接到独立的主服务器。另外,发送的数据包大小被限制在所有的设备上都被限制为1200字节,如果数据大于1200字节则分发在多个命令中。这样是可靠的,客户端可以重组数据报,这就是我们常说的分包与组包,PhotonServer 都为我们做好了。

介绍了半天都是一些理论上的东西,涉及到具体操作,因为网上有作者分享了一篇博客详细讲述了关于 Photon Server 部署流程,在这里也发给读者参考,网址详见这里

读者可以按照这个流程就可以把服务器配置好,在这里重点的地方给读者再强调一遍,我们运行程序首先打开 deploy 目录中的文件,如果系统是64位的,点击bin_Win64文件夹中的 PhotonControl.exe 程序运行,效果如下:

enter image description here

我们可以自定义服务器就像博客中介绍的那样,我们也可以在配置文件中设置服务器 IP 地址。

enter image description here

 

服务器配置可以使用局域网,如果使用外网需要把服务器配置到云服务器,比如阿里云服务器,这样访问就很方便了,我们的架构设计使用的是 Photon Server 官方提供的云服务器,主要是方便测试,Photon Server 免费版只支持20个用户同时在线上,如果需要增多人数,需要读者购买。服务器部署其实比较简单,部署好了服务器后,我们要进行测试看看服务器是否是连通的。

服务器与客户端通信测试

测试服务器与客户端通信,网上同样有文章为我们介绍操作步骤,网址详见这里

以上就是关于 Photon Server 的部署。

另外,我们介绍了半天也没介绍数据库,其实 Photon Server 支持 MySQL 和 NoSQL 如何与数据库通信,网上有作者已经帮我们写好教程了,在这里直接拿过来参考,网址详见这里

其中,NHibernate 是你比较成熟的,开放源的对象关系映射器的。因为 Photon Server 市面上也有一些公司在使用,对于初学者来说掌握起来比较方便,它对于用户来说开放了逻辑编写功能,使用者无需关心其内部实现,只需要根据接口文档写逻辑就可以了,而且扩展起来非常方便。Photon Server 也是在一直更新。其他的游戏服务器流程跟这个非常类似。

客户端与服务器交互流程图解
前面我们有谈到,当客户端请求连接Photon服务器时,服务器会为每个客户端创建一个PeerBase对象用于处理各种请求以及相应,如图

 一个ClientPeer对应一个PeerBase,这个PhotonServer对这些客户端Peer和服务器端Peer进行管理。

这里分服务器端和客户端进行学习。

客户端
上节课我们定义了一个PhotonEngine.cs来进行和服务器的交互,实现了Photon.Client.IPhotonPeerListener的接口。也就是ClientPeer。这里有几个重要的方法。

OnStatusChanged——当连接状态改变时调用,peer对象中有个成员属性PeerState用于标志当前连接状态,peer.PeerState连接状态有以下几种
PeerStateValue.Connecting——正在连接服务器中
PeerStateValue.Connected——已连接服务器
PeerStateValue.Disconnecting——断开服务器中
PeerStateValue.Disconnected——已断开服务器连接
PeerStateValue.InitializingApplication——服务器初始化中
OnOperationResponse——服务器成功响应后执行,方法参数OperationResponse operationResponse封装了响应的信息,这里讲解两个比较重要的信息
operationResponse.OperationCode——响应码,用于区分响应信息,既然会有区分响应的响应码,当然一定会有区分请求的请求码,在讲解服务器端时会进一步展开
operationResponse.Parameters——响应的参数,是一个Dictionary<byte, System.Object>,学过javaweb或者后端开发的童鞋,会比较熟悉这种类型的数据。这个数据便是服务器返回的游戏数据串。
注意:只有发送请求给服务器后,服务器端调用SendOperationResponse方法才会调用
OnEvent——服务器主动发送消息给客户端时调用,方法参数EventData eventData和OperationResponse有异曲同工之妙
注意:无需发送请求给服务器,当服务器调用SendEvent方法时调用
DebugReturn——当服务器返回一个Debug信息时调用。
以上四个IPhotonPeerListener接口中的方法用于监听客户端与服务器交互的各种操作,主要的游戏数据同步都需要使用以上的方法。

服务器端
打开服务器项目MyGameServer,我们之前创建了一个ClientPeer的类,继承自Photon.SocketServer.ClientPeer,实现了两个方法进行客户端请求的处理。

OnOperationRequest——当成功接收到请求时调用
OperationRequest operationRequest——封装了请求的参数信息,这个对象有两个属性需要关注,分别是
operationRequest.OperationCode——区分请求
operationRequest.Parameters——请求的参数,同样是Dictionary<byte, System.Object>类型
SendParameters sendParameters
OnDisconnect——当断开连接时调用
客户端与服务器交互流程
各位看官请看图:

当客户端Peer 调用OpCustom方法请求服务器时,服务器的PeerBase对象会接收到这个请求,OnOperationRequest便会执行,当服务器处理数据后,可以对客户端Peer进行响应,也可以不响应。如果需要响应客户端Peer的话,需要在OnOperationRequest处理数据后调用SendOperationResponse方法进行响应。需要注意的是,客户端Peer的OnOperationResponse只用在Peer请求服务器端后,服务器在OnOperationRequest调用SendOperationResponse方法才会响应。可能会有点乱,简单来说就是客户端Peer需要得到响应的话就必须请求服务器,并且服务器在处理该条请求后响应客户端OnOperationResponse才会被调用。

服务器可以主动发送事件到客户端,也就是通过SendEvent方法通知客户端,这是客户端的OnEvent便会被调用。

基础原理就基本讲完了,接下来就是写代码了。

https://yangshuohao.blog.csdn.net/article/details/98475267

Unity网络编程之Photon Server(四)_unity photon_typedef3306的博客-CSDN博客

猜你喜欢

转载自blog.csdn.net/qq_42672770/article/details/129817321
今日推荐