Photon Server 和 Unity3D 数据交互:
Photon Server 服务端编程
Unity3D 客户端编程
VS2017 之 MYSQL实体数据模型
一:Photon Server的下载安装:
https://www.photonengine.com/zh-CN/sdks#server-sdkserverserver
点击下载 Download SDK(需注册登陆下载)
二:Photon Server的服务端编程:
1、新建项目MyGameServer,引用外部库(5个)并设置PhotonServer.config文件。

设置PhotonServer.config文件

- 1 <MMoInstance <!--这个Photon instances的名称-->
- 2 MaxMessageSize="512000"
- 3 MaxQueuedDataPerPeer="512000"
- 4 PerPeerMaxReliableDataInTransit="51200"
- 5 PerPeerTransmitRateLimitKBSec="256"
- 6 PerPeerTransmitRatePeriodMilliseconds="200"
- 7 MinimumTimeout="5000"
- 8 MaximumTimeout="30000"
- 9 DisplayName="MyGame" <!--显示在Photon instances的名称-->
- 10 >
- 11
- 12 <!-- 0.0.0.0 opens listeners on all available IPs. Machines with multiple IPs should define the correct one here. -->
- 13 <!-- Port 5055 is Photon's default for UDP connections. -->
- 14 <UDPListeners>
- 15 <UDPListener
- 16 IPAddress="0.0.0.0"
- 17 Port="5055"
- 18 OverrideApplication="MyGame1">"<!--指明这个端口号是给哪个Application使用的-->
- 19 </UDPListener>
- 20 </UDPListeners>
- 21
- 22 <!-- 0.0.0.0 opens listeners on all available IPs. Machines with multiple IPs should define the correct one here. -->
- 23 <!-- Port 4530 is Photon's default for TCP connecttions. -->
- 24 <!-- A Policy application is defined in case that policy requests are sent to this listener (known bug of some some flash clients) -->
- 25 <TCPListeners>
- 26 <TCPListener
- 27 IPAddress="0.0.0.0"
- 28 Port="4530"
- 29 PolicyFile="Policy\assets\socket-policy.xml"
- 30 InactivityTimeout="10000"
- 31 OverrideApplication="MyGame1"
- 32 >
- 33 </TCPListener>
- 34 </TCPListeners>
- 35
- 36 <!-- Policy request listener for Unity and Flash (port 843) and Silverlight (port 943) -->
- 37 <PolicyFileListeners>
- 38 <!-- multiple Listeners allowed for different ports -->
- 39 <PolicyFileListener
- 40 IPAddress="0.0.0.0"
- 41 Port="843"
- 42 PolicyFile="Policy\assets\socket-policy.xml"
- 43 InactivityTimeout="10000">
- 44 </PolicyFileListener>
- 45 <PolicyFileListener
- 46 IPAddress="0.0.0.0"
- 47 Port="943"
- 48 PolicyFile="Policy\assets\socket-policy-silverlight.xml"
- 49 InactivityTimeout="10000">
- 50 </PolicyFileListener>
- 51 </PolicyFileListeners>
- 52
- 53 <!-- WebSocket (and Flash-Fallback) compatible listener -->
- 54 <WebSocketListeners>
- 55 <WebSocketListener
- 56 IPAddress="0.0.0.0"
- 57 Port="9090"
- 58 DisableNagle="true"
- 59 InactivityTimeout="10000"
- 60 OverrideApplication="MyGame1">
- 61 </WebSocketListener>
- 62 </WebSocketListeners>
- 63
- 64 <!-- Defines the Photon Runtime Assembly to use. -->
- 65 <Runtime
- 66 Assembly="PhotonHostRuntime, Culture=neutral"
- 67 Type="PhotonHostRuntime.PhotonDomainManager"
- 68 UnhandledExceptionPolicy="Ignore">
- 69 </Runtime>
- 70
- 71
- 72 <!-- Defines which applications are loaded on start and which of them is used by default. Make sure the default application is defined. -->
- 73 <!-- Application-folders must be located in the same folder as the bin_win32 folders. The BaseDirectory must include a "bin" folder. -->
- 74 <Applications Default="MyGame1"><!--客户端连接服务器未指定Application时连接默认的Application-->
- 75
- 76 <!-- MMO Demo Application -->
- 77 <Application
- 78 Name="MyGame1"<!--应用名称-->
- 79 BaseDirectory="MyGameServer"<!--\deploy下这个服务器应用的文件名称-->
- 80 Assembly="MyGameServer"<!-—程序集名称-->
- 81 Type="MyGameServer.MyGames"<!--主类名称-->
- 82 ForceAutoRestart="true"<!--是否自动重启-->
- 83 WatchFiles="dll;config"
- 84 ExcludeFiles="log4net.config">
- 85 </Application>
- 86
- 87 </Applications>
- 88 </MMoInstance>
2、新建MyGames类继承ApplicationBase作为服务器启动类,并实现其抽象方法。
- 1 using System.Linq;
- 2 using System.Text;
- 3 using System.Threading.Tasks;
- 4 using ExitGames.Logging;
- 5 using Photon.SocketServer;
- 6 using log4net.Config;
- 7 using ExitGames.Logging.Log4Net;
- 8
- 9 namespace MyGameServer
- 10 {
- 11 public class MyGames : ApplicationBase
- 12 {
- 13 /// <summary>
- 14 /// 获得日志对象 引用ExitGames.Logging命名空间
- 15 /// </summary>
- 16 public static readonly ILogger Log = LogManager.GetCurrentClassLogger();
- 17
- 18 /// <summary>
- 19 /// 客户端连接请求时执行
- 20 /// </summary>
- 21 /// <param name="initRequest">客户端信息</param>
- 22 /// <returns></returns>
- 23 protected override PeerBase CreatePeer(InitRequest initRequest)
- 24 {
- 25 Log.Info("客户端连接成功!。。。。。");
- 26 return new ClientPeers(initRequest);
- 27 }
- 28
- 29 /// <summary>
- 30 /// 初始化
- 31 /// </summary>
- 32 protected override void Setup()
- 33 {
- 34 log4net.GlobalContext.Properties["Photon:ApplicationLogPath"] =Path.Combine(Path.Combine(this.ApplicationRootPath, "bin_Win64"),"log");
- 35 //引用System.IO命名空间 日志设置
- 36 FileInfo configInfo = new FileInfo(Path.Combine(this.BinaryPath, "log4net.config"));
- 37 if (configInfo.Exists)
- 38 {
- 39 //引用ExitGames.Logging.Log4Net命名空间
- 40 LogManager.SetLoggerFactory(Log4NetLoggerFactory.Instance); //设置使用log4net插件
- 41 //引用log4net.Config命名空间
- 42 XmlConfigurator.ConfigureAndWatch(configInfo);//读取日志文件
- 43 }
- 44 Log.Info("初始化成功!。。。。。");
- 45 }
- 46 /// <summary>
- 47 /// 关闭时
- 48 /// </summary>
- 49 protected override void TearDown()
- 50 {
- 51 Log.Info("服务器成功关闭!。。。。。");
- 52 }
- 53 }
- 54 }
3、客户端连接类ClientPeers继承ClientPeer类并实现其抽象方法。
- 1 using System;
- 2 using System.Collections.Generic;
- 3 using System.Linq;
- 4 using System.Text;
- 5 using System.Threading.Tasks;
- 6 using Photon.SocketServer;
- 7 using PhotonHostRuntimeInterfaces;
- 8
- 9 namespace MyGameServer
- 10 {
- 11 public class ClientPeers :ClientPeer
- 12 {
- 13 public ClientPeers(InitRequest initRequest):base(initRequest)
- 14 {
- 15 }
- 16
- 17 protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
- 18 {
- 19 MyGames.Log.Info("客户端断开连接!.....");
- 20 }
- 21
- 22 protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
- 23 {
- 24 //根据客户端请求类型分类
- 25 switch(operationRequest.OperationCode)
- 26 {
- 27 case 1:
- 28 //客户端数据获得
- 29 object i, j;
- 30 Dictionary<byte, object> date = operationRequest.Parameters;
- 31 date.TryGetValue(1,out i);
- 32 date.TryGetValue(2,out j);
- 33 //日志输出
- 34 MyGames.Log.Info(String.Format("收到一个请求!。。。。。{0},{1}",i,j));
- 35 //返回客户端信息
- 36 OperationResponse op = new OperationResponse(1);
- 37 op.Parameters = date;
- 38 //SendOperationResponse只适用于双向交互时(即已由客户端发出请求,再有服务端返回),由服务端到客户端。
- 39 SendOperationResponse(op, sendParameters);
- 40 //单方面由服务端向客户端发送消息
- 41 EventData eventData = new EventData(1);
- 42 eventData.Parameters = date;
- 43 SendEvent(eventData, sendParameters);
- 44 break;
- 45 case 2:
- 46 break;
- 47 default:
- 48 break;
- 49 }
- 50 }
- 51 }
- 52 }
4、引入日志配置文件log4net.config
- 1 <?xml version="1.0" encoding="utf-8" ?>
- 2 <log4net debug="false" update="Overwrite">
- 3
- 4 <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
- 5 <file type="log4net.Util.PatternString" value="%property{Photon:ApplicationLogPath}\\MyGame.Server.log" />
- 6 <!--MyGame.Server修改为自己想要的日志文件名称-->
- 7 <appendToFile value="true" />
- 8 <maximumFileSize value="5000KB" />
- 9 <maxSizeRollBackups value="2" />
- 10 <layout type="log4net.Layout.PatternLayout">
- 11 <conversionPattern value="%d [%t] %-5p %c - %m%n" />
- 12 </layout>
- 13 </appender>
- 14
- 15 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
- 16 <layout type="log4net.Layout.PatternLayout">
- 17 <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
- 18 </layout>
- 19 <filter type="log4net.Filter.LevelRangeFilter">
- 20 <levelMin value="DEBUG" />
- 21 <levelMax value="FATAL" />
- 22 </filter>
- 23 </appender>
- 24
- 25 <!-- logger -->
- 26 <root>
- 27 <level value="INFO" />
- 28 <!--<appender-ref ref="ConsoleAppender" />-->
- 29 <appender-ref ref="RollingFileAppender" />
- 30 </root>
- 31
- 32 <logger name="OperationData">
- 33 <level value="INFO" />
- 34 </logger>
- 35
- 36 </log4net>