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就可以了!
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.1,生成,在VS的解决方案资源管理器上点选我们的工程,右键打开属性,点击生成项目,选择输出路径Photon安装路径\deploy文件夹下新建ILovePaoHuZi文件夹,保存修改,选择生成。
2.2,设置PhotoServer
Photon安装路径\deploy文件夹有几个文件夹,其中一个就是我们刚刚生成的项目,还有bin_Win64,bin_Win32等文件夹,根据自己的系统选择一个文件夹,我的是WIN64位的,所以我选择bin_Win64文件夹打开,找到一个PhotonServer.config的文件,使用VS打开它,进行配置,将我们的这个服务器加进去。复制mmoDome的设置,就是以
下面还有一个CounterPublisher的
2.3,启动服务器
在bin_Win64文件下有一个叫做PhotonControl.exe的文件,双击运行它,然后过会就会在你的电脑右下角多出一个它的图标,右击它,会出现一个小菜单,选择IlovePaoHuzi项目,选择Start As application,就是启动服务器了。刚刚这个小菜单下面还有一个OPen log的选项,打开它,会运行一个log的查看程序,选择打开,到Log目录下选择ILovePaoHuZiILovePaoHuZi.log我们的服务器Log文件,很快就可以看到我们在工程中输出的服务器启动字样了;选择STOP application,就是停止服务器,好了,服务器架设完毕,下一章我们来建立服务器的其他内容,现在的服务器只是一个大概架构而已,还不能运行任何反应。请等待下一章把。
有疑问的请联系我的微信:微信ID是hmokhmok