使用PhotonServer和Unity建立一个棋牌类游戏实例(一)构建photon服务器基础架构

1、构建PhotonServer工程
下载和配置完成PhotonServer后,我们要开始建立服务器工程了。

1.1 使用VS2015建立一个C#类库,名字叫做ILovePaoHuZi(我爱跑胡子,哈哈),然后引用Photon-lib文件夹下的5个DLL库,他们分别是 ExitGamesLibs.dll,Photon.SocketServer.dll,PhotonHostRuntimeInterfaces.dll,ExitGames.Logging.Log4Net.dll,log4net.dll。

前3个是工作类库,后2个是日志输出用的类库,全部引用进来;

1.2 修改VS添加的那个class文件名字为需要的名字,我们叫做MainClass;添加继承ApplicationBase,他是Photon.SocketServer下的,需要先using Photon.SocketServer,再实现其继承的抽象方法,变成这样:

using Photon.SocketServer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ILovePaoHuZi
{
    public class MainClass : ApplicationBase
    {
        //当有客户端连接上服务器时,将引用这个方法,建立一个客户端处理类,我们叫它ClientPeer,他是一个继承自PeerBase的自定义类
        protected override PeerBase CreatePeer(InitRequest initRequest)
        {
           // throw new NotImplementedException();
        }
        //服务器启动成功的时候会调用这个方法
        protected override void Setup()
        {
           // throw new NotImplementedException();
        }
        //服务器停止的时候会调用这个方法
        protected override void TearDown()
        {
           // throw new NotImplementedException();
        }
    }
}
1.3 好了,我们下面建立服务器与客户端通讯的peer类,在VS上新建一个类名字叫做Client……我怕我记不住,要不我还是用中文做类名吧,它的名字“客户端Peer”,上面说了它继承自PeerBase,其实我是骗你的,他继承自ClientPeer,不过ClientPeer却是继承自 PeerBase的,所以我也没错,添加继承完了后,实现下抽象类,然后添加一个构造函数,具体请看代码:

namespace ILovePaoHuZi
{
    class 客户端Peer : ClientPeer
    {
        //这个自定义类的构造方法,因为他的父类同样需要参数构造,所以加上base(initRequest)
        public 客户端Peer(InitRequest initRequest):base(initRequest){

        }
        //当客户端断线的时候调用的方法
        protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
        {
            //throw new NotImplementedException();
        }

        //当服务器收到来自这个客户端的请求的时候的方法
        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
           // throw new NotImplementedException();
        }
    }
}
1.4 然后我们回到MainClass中为每一位连接上服务器的客户端建立一个“客户端Peer”类,专门用来处理这个客户端的请求(后面只发这个方法了,最后一阶段后会发出全部的代码):

 //当有客户端连接上服务器时,将引用这个方法,建立一个客户端处理类,我们叫它ClientPeer,他是一个继承自PeerBase的自定义类
        protected override PeerBase CreatePeer(InitRequest initRequest)
        {
            客户端Peer temp = new 客户端Peer(initRequest);
            return temp;
        }
好了,客户端Peer创建好了,以后客户端的信息就会直接发到那个类的OnOperationRequest方法里面,其参数就是通讯内容,我们称之为客户端请求;

1.5 添加服务器的日志功能LOG

这个功能比较麻烦,我们可以照抄Photon样板工程Loadbalancing的代码,他的工程文件处于Photon安装路径\src-server\Loadbalancing下,使用VS打开它拷贝就好了,当然你们也可以偷懒抄我的代码,下面就是在MainClass中需要添加的1个方法,并在steup方法中运行它,就是初始化LOG:

        //设置Log文件
        protected virtual void InitLogging()
        {
            ExitGames.Logging.LogManager.SetLoggerFactory(Log4NetLoggerFactory.Instance);
            //这里是设置Log文件储存的路径,一般不用改了
            GlobalContext.Properties["Photon:ApplicationLogPath"] = Path.Combine(this.ApplicationRootPath, "log");
            //将这里的"MS"改成"ILovePaoHuZi"
            GlobalContext.Properties["LogFileName"] = "ILovePaoHuZi" + this.ApplicationName;
            //注意,这里有一个log4net.config配置文件需要拷贝到工程里面来,并且要设置其输出时为拷贝
            //这个文件位于Photon安装路径\src-server\Loadbalancing\Loadbalancing文件下,
            //复制进工程后,点击它选择属性-高级-复制到输出目录这一项,原来是不复制,改成始终复制
            XmlConfigurator.ConfigureAndWatch(new FileInfo(Path.Combine(this.BinaryPath, "log4net.config")));
        }

//服务器启动成功的时候会调用这个方法
        protected override void Setup()
        {
            
            InitLogging();
            log.Debug("服务器启动");
        }
        //服务器停止的时候会调用这个方法
        protected override void TearDown()
        {
            log.Debug("服务器停止");
            
        }
还有下面这个接口变量的定义,复制到MainClass的变量定义区(不要放在任何方法里面):

private static readonly ILogger log = ExitGames.Logging.LogManager.GetCurrentClassLogger();
以后在这个类里面就可以使用下面的方式来输出内容到日志文件了:
log.Debug("要输出到日志的内容");
其他的类要输出到日志,直接在类里面也定义一个就可以了:
private static readonly ILogger log = ExitGames.Logging.LogManager.GetCurrentClassLogger();

然后,我们需要向工程里面复制一个log4net.config文件过来,它位于位于Photon安装路径\src-server\Loadbalancing\Loadbalancing文件下,复制进工程后,点击它选择属性-高级-复制到输出目录这一项,改成始终复制

OK,下面我们修改刚刚复制过来的log4net.config文件的配置就完成了;

打开它,删除掉其中几个包含LoadBalancer的设置项目即可,如下2个:

 <!-- add more "logger" elements for further classes / namespaces here -->     

  <logger name="Photon.LoadBalancing.MasterServer.Lobby.LobbyStatsPublisher">
    <level value="INFO" />    
  </logger>  

  <logger name="Photon.Common.LoadBalancer.LoadShedding">
    <level value="INFO" />    
  </logger>  
然后将ROOT设置里面的 level value内容改成DEBUG就可以了!

<root>
    <level value="DEBUG" />
    <appender-ref ref="LogFileAppender" /> 
    <appender-ref ref="ConsoleAppender" />
	</root>


好了,服务器的初始架构就完成了,下面我发一下2个类的代码:

namespace ILovePaoHuZi
{
    public class MainClass : ApplicationBase
    {
        private static readonly ILogger log = ExitGames.Logging.LogManager.GetCurrentClassLogger();

        //当有客户端连接上服务器时,将引用这个方法,建立一个客户端处理类,我们叫它ClientPeer,他是一个继承自PeerBase的自定义类
        protected override PeerBase CreatePeer(InitRequest initRequest)
        {
            客户端Peer temp = new 客户端Peer(initRequest);
            return temp;
        }
        //服务器启动成功的时候会调用这个方法
        protected override void Setup()
        {
            
            InitLogging();
            log.Debug("服务器启动");
        }
        //服务器停止的时候会调用这个方法
        protected override void TearDown()
        {
            log.Debug("服务器停止");
            
        }
        //设置Log文件
        protected virtual void InitLogging()
        {
            ExitGames.Logging.LogManager.SetLoggerFactory(Log4NetLoggerFactory.Instance);
            //这里是设置Log文件储存的路径,一般不用改了
            GlobalContext.Properties["Photon:ApplicationLogPath"] = Path.Combine(this.ApplicationRootPath, "log");
            //将这里的"MS"改成"ILovePaoHuZi"
            GlobalContext.Properties["LogFileName"] = "ILovePaoHuZi" + this.ApplicationName;
            //注意,这里有一个log4net.config配置文件需要拷贝到工程里面来,并且要设置其输出时为拷贝
            //这个文件位于Photon安装路径\src-server\Loadbalancing\Loadbalancing文件下,
            //复制进工程后,点击它选择属性-高级-复制到输出目录这一项,原来是不复制,改成始终复制
            XmlConfigurator.ConfigureAndWatch(new FileInfo(Path.Combine(this.BinaryPath, "log4net.config")));
        }
    }
}

namespace ILovePaoHuZi
{
    class 客户端Peer : ClientPeer
    {
        private static readonly ILogger log = ExitGames.Logging.LogManager.GetCurrentClassLogger();
        //这个自定义类的构造方法,因为他的父类同样需要参数构造,所以加上base(initRequest)
        public 客户端Peer(InitRequest initRequest):base(initRequest){
            
        }
        //当客户端断线的时候调用的方法
        protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
        {
            
        }

        //当服务器收到来自这个客户端的请求的时候的方法
        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
            
        }
    }
}

2、开始架设我们的ILovePaoHuZi服务器了

2.1,生成,在VS的解决方案资源管理器上点选我们的工程,右键打开属性,点击生成项目,选择输出路径Photon安装路径\deploy文件夹下新建ILovePaoHuZi文件夹,保存修改,选择生成。

2.2,设置PhotoServer

Photon安装路径\deploy文件夹有几个文件夹,其中一个就是我们刚刚生成的项目,还有bin_Win64,bin_Win32等文件夹,根据自己的系统选择一个文件夹,我的是WIN64位的,所以我选择bin_Win64文件夹打开,找到一个PhotonServer.config的文件,使用VS打开它,进行配置,将我们的这个服务器加进去。复制mmoDome的设置,就是以<MMoDemo开始,到</MMoDemo>结束的所有内容,然后粘贴到空白区域,将所有MMoDemo修改成ILovePaoHuZi,就是我们的服务器名字,其中

 <Applicatin改成下面这样,Assembly代表程序集的名字,就是你刚刚建立的工程的命名空间ILovePaoHuZi,Type就是你的主入口类,需要写完整路径,也就是就命名空间+类名:ILovePaoHuZi.MainClass

<Application
				Name="ILovePaoHuZi"
				BaseDirectory="ILovePaoHuZi"
				Assembly="ILovePaoHuZi"
				Type="ILovePaoHuZi.MainClass"
				ForceAutoRestart="true"
				WatchFiles="dll;config"
				ExcludeFiles="log4net.config">
      </Application>
下面还有一个CounterPublisher的  <Applicatin设置,这个需要保留,是服务器连接用的。好了,修改完了保存,注意其中有TCPIP设置,UDP设置等等,记住端口号,客户端访问的时候会用到;


2.3,启动服务器

bin_Win64文件下有一个叫做PhotonControl.exe的文件,双击运行它,然后过会就会在你的电脑右下角多出一个它的图标,右击它,会出现一个小菜单,选择IlovePaoHuzi项目,选择Start As application,就是启动服务器了。刚刚这个小菜单下面还有一个OPen log的选项,打开它,会运行一个log的查看程序,选择打开,到Log目录下选择ILovePaoHuZiILovePaoHuZi.log我们的服务器Log文件,很快就可以看到我们在工程中输出的服务器启动字样了;选择STOP application,就是停止服务器,好了,服务器架设完毕,下一章我们来建立服务器的其他内容,现在的服务器只是一个大概架构而已,还不能运行任何反应。请等待下一章把。

有疑问的请联系我的微信:微信ID是hmokhmok




  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 对接网狐服务器 ——波波 网狐的棋牌服务器非常稳定,代码质量高,最重要的是开源。阅 读网狐的代码,自我感觉技术提高不少,真心感谢网狐! 网狐的 PC 客户端的代码,和服务器代码同出一辙,优秀稳定, 功能齐全。唯独移动平台的客户端的研发稍微有点落后。前几年,网 狐为 Android和 iPhone两个移动平台分别开发了大厅, 弊端显而易见, 一个游戏就会同时配有三个不同平台的客户端,也就是说,需要使用 三种编程语言来实现客户端才能满足市场的需求。 这三种语言分别是 C++,java,object-C。开发难度之大,可想而知。 2016 年 2 月,网狐终于推出了 cocos2d 的客户端,而在网狐推出 cocos 客户端之前,不少公司已经做到使用 cocos 客户端来对接网狐 的服务器了。然而,使用 unity 对接网狐服务器这个解决方案,网狐 迟迟还没有给出。下面简单介绍一下 unity 对接网狐服务器的解决方 案。 想对接成功,需要看懂网狐的服务器代码。网狐的代码其实并不 难, 工作经验超过一年的 C++程序员应该都可以看懂的。 网狐的 6603 版和经典版服务器, 上层的功能较多, 想理清代码逻辑, 需要点时间。 建议从网狐 6601 版服务器看起。 只需要看懂下面 9 个项目工程就 OK。 编译代码的先后顺序:公共服务,网络服务,列表服务,内核引 擎,游戏服务,中心服务器,登录服务器,服务装载器。 共享组件是客户端和服务端公用的工程。其中公共服务项目会被 内核引擎使用到,编译顺序需要优先;网络服务会被登录服务器和游 戏服务使用到,编译顺序需要优先。 编译整个解决方案后,会生成三个可执行文件和多个 DLL。三个 可 执 行 文 件 分 别 是 中 心 服 务 器 CenterServer.exe , 登 录 服 务 器 LogonServer.exe,服务装载器 ServiceLoader.exe。优先启动中心服务 器,再接着启动登录服务器服务器装载器。 下面说说这三者之间的关系: 中心服务器:是登录服务器和所有游戏服务器服务器,也就是 说, 在服务器层面上, 登录服务器游戏服务器的角色是一个客户端。 中心服务器启动后,各个游戏服务器再启动。这个过程中,游戏 服务器要向中心服务器进行房间注册。然后,启动登录服务器。登录 服务器会定时地向中心服务器请求游戏房间的列表。 登录服务器:对应的客户端的大厅,大厅登录后,除了会获得当 前玩家的个人信息,还会获得游戏列表等多种信息。 游戏服务器:对应着具体的游戏客户端。由服务器装载器启动, 也就是由服务器装载器来启动各个游戏服务器项目编译出来的 DLL。 上面说法,仅仅针对网狐棋牌 6601 版本,事实上,网狐 6603 版 本在服务器结构设计上已经做了较大幅度的改动。但能看懂 6601 代 码的,也会看得懂 6603 代码,因为服务器的内核几乎没有变化,主 体架构不变。 下面开始介绍 unity 客户端。为了缩短开发示例时间,就采用 .net 的 WinForm 来做界面。代码可以直接移植到 unity。不解释。示例是 五子棋游戏。 在介绍示例前,先说说网狐的加解密方法和数据传输的协议。这 两个是难点,你能看得懂网狐的 C++版加解密方法和数据传输的协 议,并且能用其他一门语言翻译出来,就说明你的编程功底已经很不 错的,这篇漏文就不用看了,谢谢。 网狐加解密方法,是自研的。过程环环相扣,加密后的数据分析 难度大,解密难度也大。因为上一次发送的数据会作为下一次加密数 据的密钥。而上一次解密出来的数据又会作为下一次机密数据的密 钥。 就连第一次的加密密钥都是随机产生的。 应该不少公司采用 MD5 加密方法来加密数据。MD5 加密的数据是不可逆的,代价也很大。 一是 MD5 准确来说是签名,发送的数据被拦截后,整个数据包的内 容都可以分析,甚至可以换掉签名。二是,看看 MD5 的 C++实现, 就明白一次 MD5 加密会耗费多少服务器的 CPU。客户端的数据源源 不断,服务器要耗费多少时间在 MD5 加密验证上? 采用映射表和异或方法两层加密。映射方法,翻译简单。异或加 密方法,相对较难。 我用两个类来分别实现这两种加密方法。 这个过程其实并不简单。 具体看我的代码,不一一说。 接着是数据传输的协议,必须和服务器一样,才能传递正确的数 据。 难点在发送数据时,怎么组装一个命令的,并且为这个命令加密。 不一一说,具体看代码。 接下来,是大厅的介绍。 大厅要实现的功能不少,主要有注册登录获取个人信息,获取游 戏列表。其他功能,实现起来相对简单。 对应的是客户端工程的这部分代码。 再接着,是房间的功能介绍。主要包括:系统消息,公聊消息, 私聊消息,消息推送,银行操作,鲜花道具等

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值