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

文章目录

  • 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.hqwc.cn/news/53018.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode //C - 289. Game of Life

289. Game of Life According to Wikipedia’s article: “The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conway in 1970.” The board is made up of an m x n grid of cells, where each cell…

JVM基础篇-方法区与运行时常量池

JVM基础篇-方法区与运行时常量池 方法区 Java 虚拟机有一个在所有 Java 虚拟机线程之间共享的方法区。方法区类似于传统语言的编译代码的存储区或者类似于操作系统进程中的“文本”段。它存储每个类的结构&#xff0c;例如运行时常量池、字段和方法数据&#xff0c;以及方法和…

Hyper实现git bash在windows环境下多tab窗口显示

1.电脑上安装有git bash 下载链接&#xff1a;https://gitforwindows.org/ 安装Hyper 下载链接:官网 https://hyper.is/ 或者在百度云盘下载&#xff1a; https://pan.baidu.com/s/1BVjzlK0s4SgAbQgsiK1Eow 提取码&#xff1a;0r1f 设置 打开Hyper&#xff0c;依次点左上角-&g…

(学习笔记-进程管理)进程

进程 我们编写的代码只是一个存储在硬盘的静态文件&#xff0c;通过编译后会生成二进制可执行文件&#xff0c;当我们运行这个可执行文件后&#xff0c;它会被装载到内存中&#xff0c;接着CPU会执行程序中的每一条指令&#xff0c;那么这个运行中的程序就被称为进程。 现在我…

【C++】——内存管理

目录 回忆C语言内存管理C内存管理方式new deleteoperator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)malloc/free和new/delete的区别 回忆C语言内存管理 void Test() {int* p1 (int*)malloc(sizeof(int));free(p1);int* p2 (int*)calloc(4…

攻防世界-reverse-logmein

题目描述&#xff1a;菜鸡开始接触一些基本的算法逆向了 下载附件&#xff0c;是一个可执行程序 1. 思路分析 逆向出来看看代码 从代码中来看&#xff0c;密码长度需要和V8相等&#xff0c;并且每一个字符的运算结果需要满足 s[i] (char)(v8[i % v6 - 8] ^ v8[i]) 但是这…

openGauss学习笔记-31 openGauss 高级数据管理-索引

文章目录 openGauss学习笔记-31 openGauss 高级数据管理-索引31.1 语法格式31.2 参数说明31.3 示例 openGauss学习笔记-31 openGauss 高级数据管理-索引 索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。 索引可以用来提高数据库查询性能&…

从零开始理解Linux中断架构(24)软中断核心函数__do_softirq

1)概要 __do_softirq函数处理是总是尽可能的执行所有未决软中断。 (1)关闭软中断:在preempt_count设置软中断标志:SOFTIRQ_OFFSET 让in_interrupt检查条件为真,进入软中断处理临界区,后面进来的处理请求,需要检查in_interrupt(),从而达到禁止本cpu上的软中断嵌套的目…

【雕爷学编程】MicroPython动手做(33)——物联网之天气预报

天气&#xff08;自然现象&#xff09; 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象&#xff0c;即某瞬时内大气中各种气象要素&#xff08;如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等&#xff…

Java三大特征之继承【超详细】

文章目录 一、继承概念二、继承的语法三、父类成员访问3.1子类中访问父类的成员变量3.2子类和父类成员变量同名3.3子类中访问父类的成员方法 四、super关键字五、子类构造方法六、super和this七、再谈初始化八、protected 关键字九、继承方式十、final 关键字十一、继承与组合 …

springboot+vue农业技术信息管理系统_9927h

随着信息时代的发展&#xff0c;计算机迅速普及&#xff0c;传统的农业信息管理方式显得不够快捷&#xff0c;这时我们就需要创造更加便利的管理方法&#xff0c;对农业信息进行统计&#xff0c;便于统一管理。将传统管理方式转变为信息、智能化显得尤为重要&#xff0c;农业信…

选读SQL经典实例笔记18_Exactly

1. 问题9 1.1. 只讲授一门课程的教授 1.2. sql select p.*from professor p,teach twhere p.lname t.lnameand p.lname not in ( select t1.lnamefrom teach t1,teach t2where t1.lname t2.lnameand t1.cno &#xff1e; t2.cno ) LNAME DEPT SALARY …