Unity进阶--使用PhotonServer实现服务端和客户端通信--PhotonServer(一)

news/2025/1/17 13:48:54/

文章目录

  • Unity进阶--使用PhotonServer实现服务端和客户端通信
    • 服务器的安装和配置
    • 添加日志
    • 客户端的配置
    • 客户端和服务器的通信
    • Dlc 出现vscode引用不好使的时候

Unity进阶–使用PhotonServer实现服务端和客户端通信

服务器的安装和配置

Photon的地址:https://www.photonengine.com/zh-cn/sdks

  • 下载对应的sdk:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nqhFg3FR-1691110946416)(../AppData/Roaming/Typora/typora-user-images/image-20230802150527693.png)]

  • 在Visual studio 里创建新的类库:

**[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YNC7wHVC-1691110946416)(../AppData/Roaming/Typora/typora-user-images/image-20230802151715763.png)]**

在项目里添加对应的dll文件引用:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SfcLhTkB-1691110946417)(../AppData/Roaming/Typora/typora-user-images/image-20230802160144216.png)]

在这个文件夹里找:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v58YvXYT-1691110946417)(../AppData/Roaming/Typora/typora-user-images/image-20230802175928178.png)]

这五个插件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XdLbRv77-1691110946417)(../AppData/Roaming/Typora/typora-user-images/image-20230802160856827.png)]

编写服务器端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Photon.SocketServer;namespace PhotonServerFirst
{public class PSTest : ApplicationBase{protected override PeerBase CreatePeer(InitRequest initRequest){ return new PSpeer(initRequest);}protected override void Setup(){}protected override void TearDown(){}}
}

编写客户端模板

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Photon.SocketServer;
using PhotonHostRuntimeInterfaces;namespace PhotonServerFirst
{public class PSpeer : ClientPeer{public PSpeer(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();}}
}

创建服务器文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9g2BXhfS-1691110946417)(../AppData/Roaming/Typora/typora-user-images/image-20230802152237347.png)]

  • 修改生成目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OZs48M4L-1691110946418)(../AppData/Roaming/Typora/typora-user-images/image-20230802182536425.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dvn72gRd-1691110946418)(../AppData/Roaming/Typora/typora-user-images/image-20230802182941475.png)]

放到之前创建的bin里。

然后生成。

  • 修改PhotonServer配置文件

在[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H5BLT0QY-1691110946420)(../AppData/Roaming/Typora/typora-user-images/image-20230803090947410.png)]
寻找

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PpBI5krl-1691110946424)(../AppData/Roaming/Typora/typora-user-images/image-20230803091005322.png)]

  • 配置文件:

         <!-- DisplayName:显示名称 --><PhotonServerFirstMaxMessageSize="512000"MaxQueuedDataPerPeer="512000"PerPeerMaxReliableDataInTransit="51200"PerPeerTransmitRateLimitKBSec="256"PerPeerTransmitRatePeriodMilliseconds="200"MinimumTimeout="5000"MaximumTimeout="30000"DisplayName="PhotonServerFirst"><!-- 0.0.0.0 opens listeners on all available IPs. Machines with multiple IPs should define the correct one here. --><!-- Port 5055 is Photon's default for UDP connections. --><UDPListeners><UDPListenerIPAddress="0.0.0.0"Port="5055"OverrideApplication="PhotonServerFirst"></UDPListener></UDPListeners><!-- 0.0.0.0 opens listeners on all available IPs. Machines with multiple IPs should define the correct one here. --><!-- Port 4530 is Photon's default for TCP connecttions. --><!-- A Policy application is defined in case that policy requests are sent to this listener (known bug of some some flash clients) --> <TCPListeners><TCPListenerIPAddress="0.0.0.0"Port="4530"PolicyFile="Policy\assets\socket-policy.xml"InactivityTimeout="10000"OverrideApplication="PhotonServerFirst"				></TCPListener></TCPListeners><!-- Defines the Photon Runtime Assembly to use. --><RuntimeAssembly="PhotonHostRuntime, Culture=neutral"Type="PhotonHostRuntime.PhotonDomainManager"UnhandledExceptionPolicy="Ignore"></Runtime><Applications Default="PhotonServerFirst"><!-- Name:要注意和上面填写的应用名字相同 --><!--BaseDirectory:编译好的dll所在文件夹名--><!--Assembly:dll名--><!--Type:命名空间.类名--><ApplicationName="PhotonServerFirst"BaseDirectory="PhotonServerFirst"Assembly="PhotonServerFirst"Type="PhotonServerFirst.PSTest"ForceAutoRestart="true"WatchFiles="dll;config"ExcludeFiles="log4net.config"></Application></Applications></PhotonServerFirst>
    

    这样photonServer下就有我们创建的服务器了。

添加日志

  1. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ocfdDxLc-1691110946425)(../AppData/Roaming/Typora/typora-user-images/image-20230803092647288.png)]
    下寻找log4net.config把它复制到工程里面。

  2. 然后把属性改为始终复制

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wJQkJxCi-1691110946427)(../AppData/Roaming/Typora/typora-user-images/image-20230803092916486.png)]

  3. 改一下输出的日志名字

    <file type="log4net.Util.PatternString" value="%property{Photon:ApplicationLogPath}\\PhotonServerFirst.Server.log" />
    
  4. 配置服务器程序

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Photon.SocketServer;
    using ExitGames.Logging;
    using ExitGames.Logging.Log4Net;
    using log4net.Config;
    using System.IO;namespace PhotonServerFirst
    {public class PSTest : ApplicationBase{//日志需要的private static readonly ILogger log = LogManager.GetCurrentClassLogger();protected override PeerBase CreatePeer(InitRequest initRequest){ return new PSpeer(initRequest);}//初始化protected override void Setup(){InitLog();}//server端关闭的时候protected override void TearDown(){}#region 日志/// <summary>/// 初始化日志以及配置/// </summary>private void InitLog(){//日志的初始化log4net.GlobalContext.Properties["Photon:ApplicationLogPath"] = this.ApplicationRootPath + @"\bin_Win64\log";//设置日志的路径FileInfo configFileInfo = new FileInfo(this.BinaryPath + @"\log4net.config");//获取配置文件if (configFileInfo.Exists){//对photonserver设置日志为log4netLogManager.SetLoggerFactory(Log4NetLoggerFactory.Instance);XmlConfigurator.ConfigureAndWatch(configFileInfo);log.Info("初始化成功");}}#endregion        }
    }
  5. 打开photonserver运行应用,日志输出则配置成功。

客户端的配置

  1. Photon-OnPremise-Server-SDK_v4-0-29-11263 > lib >下寻找Photon3Unity3D.dll放到unity3d的插件文件夹(Pluigins)里。
  2. 编写客户端脚本绑定到一个单例不会被销毁的组件里。(代码如下)

客户端和服务器的通信

  • 客户端

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using ExitGames.Client.Photon;public class PhotonManager : MyrSingletonBase<PhotonManager>, IPhotonPeerListener
    {private PhotonPeer peer;void Awake() {DontDestroyOnLoad(this);}// Start is called before the first frame updatevoid Start(){peer = new PhotonPeer(this, ConnectionProtocol.Tcp);peer.Connect("127.0.0.1:4530", "PhotonServerFirst");}void Update(){peer.Service();if (Input.GetKeyDown(KeyCode.Space)){Dictionary<byte, object> dic = new Dictionary<byte, object>();dic.Add(1,"你好,我是王小虎");peer.OpCustom(1, dic, true);}}private void OnDestroy() {//断开连接peer.Disconnect();    }public void DebugReturn(DebugLevel level, string message){}/// <summary>/// 接收服务器事件/// </summary>/// <param name="eventData"></param>public void OnEvent(EventData eventData){if(eventData.Code == 1) {Debug.Log("事件" + eventData.Parameters[1]);}}/// <summary>/// 接收服务器响应/// </summary>/// <param name="operationResponse"></param>public void OnOperationResponse(OperationResponse operationResponse){if (operationResponse.OperationCode == 1){Debug.Log(operationResponse.Parameters[1]);}}/// <summary>/// 状态改变/// </summary>/// <param name="statusCode"></param>public void OnStatusChanged(StatusCode statusCode){Debug.Log(statusCode);}}
  • 服务器

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Photon.SocketServer;
    using PhotonHostRuntimeInterfaces;namespace PhotonServerFirst
    {public class PSpeer : ClientPeer{public PSpeer(InitRequest initRequest) : base(initRequest){}//处理客户端断开的后续工作protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail){throw new NotImplementedException();}//处理客户端的请求protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters){switch (operationRequest.OperationCode){case 1://收到Dictionary<byte, object> data = operationRequest.Parameters;PSTest.log.Info("收到客户端消息:" + data[1].ToString());//返回Dictionary<byte, object> data2 = new Dictionary<byte, object>();data2.Add(1, "你好,我是服务器");//  OperationResponse operationResponse = new OperationResponse();//  operationResponse.OperationCode = 1;//  operationResponse.Parameters = data2;//创建一个响应OperationResponse operationResponse = new OperationResponse(1, data2);SendOperationResponse(operationResponse, sendParameters);//创建一个事件EventData Edata = new EventData(1, data2); SendEvent(Edata, sendParameters);break;default:break;}}}
    }

Dlc 出现vscode引用不好使的时候

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E1OopesN-1691110946427)(../AppData/Roaming/Typora/typora-user-images/image-20230803224102512.png)]

检查下这个。


http://www.ppmy.cn/news/1006630.html

相关文章

更新页面无法回显

需求与问题&#xff1a; 在菜品管理开发中&#xff0c;我需要修改菜品&#xff0c;第一步是回显页面&#xff0c;但在我再三确认代码无误的情况下依旧无法回显内容 问题发现与解决&#xff1a; 经过排查&#xff0c;我发现我的DishDTO内容如下&#xff1a; Data public clas…

ant.design 组件库中的 Tree 组件实现可搜索的树: React+and+ts

ant.design 组件库中的 Tree 组件实现可搜索的树&#xff0c;在这里我会详细介绍每个方法&#xff0c;以及容易踩坑的点。 效果图&#xff1a; 首先是要导入的文件 // React 自带的属性 import React, { useMemo, useState } from react; // antd 组件库中的&#xff0c;输入…

ISC 2023︱诚邀您参与赛宁“安全验证评估”论坛

​​8月9日-10日&#xff0c;第十一届互联网安全大会&#xff08;简称ISC 2023&#xff09;将在北京国家会议中心举办。本次大会以“安全即服务&#xff0c;开启人工智能时代数字安全新范式”为主题&#xff0c;打造全球首场AI数字安全峰会&#xff0c;赋予安全即服务新时代内涵…

python 第十章 —— 网络编程详解

文章目录 一、前言二、网络编程基础三、网络协议1.TCP2.UDP四.TCP实现聊天1.Tcp服务器2.Tcp客户端4.运行测试五.UDP实现聊天1.UDP服务器2.UDP客户端3.运行测试总结Python教程目录 https://blog.csdn.net/weixin_50964512/article/details/1303

基于长短期神经网络的风速预测,基于LSTM的风速预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的风速预测 完整代码: https://download.csdn.net/download/abc991835105/88171311 效果图 结果分析 展望 参考论文 背影 风速预测是一种比较难的预测,随机性比较大,长短期神经网络是一种改进党的RNN…

算法训练Day39|62.不同路径 ● 63. 不同路径 II

LeetCode:62.不同路径 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 1.思路 想象成矩阵填格子&#xff0c;两个关键点&#xff0c;初始化和递推公式。 初始化除点&#xff08;0&#xff0c;0&#xff09;第一行第一列均为1&#xff0c;递推公式推导dp[i][j] dp[i …

C++中声明变量以访问和使用内存

C中声明变量以访问和使用内存 下面的示例将帮助您明白变量是什么。假设您要编写一个程序&#xff0c;它将用户提供的两个数字相乘。用户被要求依次提供被乘数和乘数&#xff0c;而您需要存储它们&#xff0c;以便以后将它们相乘。您还可能需要存储乘法运算的结果&#xff0c;供…

vue3使用vue3-seamless-scroll插件

1、局部引入 import vueSeamlessScroll from "vue-seamless-scroll"; 2、注册 components: { vueSeamlessScroll, }, 3、使用 <vue3-seamless-scroll :list"list1" class"scroll" step"0.2"><div class"item"…