使用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个:

      

  
        
    

  
        
    
然后将ROOT设置里面的 level value内容改成DEBUG就可以了!


    
     
    
	


好了,服务器的初始架构就完成了,下面我发一下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修改成ILovePaoHuZi,就是我们的服务器名字,其中

 


      
下面还有一个CounterPublisher的  


2.3,启动服务器

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

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




你可能感兴趣的:(Photon服务器,unity,服务器,游戏,c#,Photon)