Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)

文章目录

  • Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)
    • 服务器端
      • 大体结构图
      • BLL层(控制层)
      • DAL层(数据控制层)
      • 模型层
      • DLC 服务器配置类 发送消息类 以及消息类

Unity进阶–通过PhotonServer实现联网登录注册功能(服务器端)–PhotonServer(二)

如何配置PhotonServer服务器:https://blog.csdn.net/abaidaye/article/details/132096415

服务器端

大体结构图

在这里插入图片描述

  • 结构图示意

在这里插入图片描述

BLL层(控制层)

  • 总管理类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace PhotonServerFirst.Bll
    {public class BLLManager{private static BLLManager bLLManager;public static BLLManager Instance{get{if(bLLManager == null){bLLManager = new BLLManager();}return bLLManager;}}//登录注册管理public IMessageHandler accountBLL;private BLLManager(){accountBLL = new Account.AccountBLL();}}
    }
  • 控制层接口

    using Net;namespace PhotonServerFirst.Bll
    {public interface IMessageHandler{//处理客户端断开的后续工作void OnDisconnect(PSpeer peer);//处理客户端的请求void OnOperationRequest(PSpeer peer, Message message);}
    }
  • 登录注册控制类

    using Net;
    using PhotonServerFirst.Dal;namespace PhotonServerFirst.Bll.Account
    {class AccountBLL : IMessageHandler{public void OnDisconnect(PSpeer peer){throw new System.NotImplementedException();}public void OnOperationRequest(PSpeer peer, Message message){//判断命令switch (message.Command){case MessageType.Account_Register:Register(peer, message);break;case MessageType.Account_Login:Login(peer, message);break;}}//注册请求 0账号1密码void Register(PSpeer peer, Message message){object[] objs = (object[])message.Content;//添加用户int res = DAlManager.Instance.accountDAL.Add((string)objs[0],(string)objs[1]);//服务器响应SendMessage.Send(peer, MessageType.Type_UI, MessageType.Account_Register_Res, res);}//登陆请求 0账号1密码void Login(PSpeer peer, Message message){object[] objs = (object[])message.Content;//登录int res = DAlManager.Instance.accountDAL.Login(peer, (string)objs[0], (string)objs[1]);//响应SendMessage.Send(peer, MessageType.Type_UI, MessageType.Account_Login_res, res);}}
    }

DAL层(数据控制层)

  • 总数据管理层

    using PhotonServerFirst.Bll;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace PhotonServerFirst.Dal
    {class DAlManager{private static DAlManager dALManager;public static DAlManager Instance{get{if (dALManager == null){dALManager = new DAlManager();}return dALManager;}}//登录注册管理public AccountDAL accountDAL;private DAlManager(){accountDAL = new AccountDAL();}}
    }
  • 登录注册数据管理层

    using PhotonServerFirst.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace PhotonServerFirst.Dal
    {class AccountDAL{/// <summary>/// 保存注册的账号/// </summary>private List<AccountModel> accountList = new List<AccountModel>();private int id = 1;///<summary>///保存已经登录的账号/// </summary>private Dictionary<PSpeer, AccountModel> peerAccountDic = new Dictionary<PSpeer, AccountModel>();///<summary>/// 添加账号///</summary>///<param name="account"> 用户名</param>///<param name="password">密码</param>///<returns>1 成功 -1账号已存在 0失败</returns>public int Add(string account, string password){//如果账号已经存在foreach (AccountModel model in accountList){if (model.Account == account){return -1;}}//如果不存在AccountModel accountModel = new AccountModel();accountModel.Account = account;accountModel.Password = password;accountModel.ID = id++;accountList.Add(accountModel);return 1;}/// <summary>/// 登录账号/// </summary>/// <param name="peer">连接对象</param>/// <param name="account">账号</param>/// <param name="password">密码</param>/// <returns>登陆成功返回账号id  -1已经登陆  0用户名密码错误</returns>public int Login(PSpeer peer, string account, string password){//是否已经登陆foreach (AccountModel model in peerAccountDic.Values){if (model.Account == account){return -1;}}//判断用户名密码是否正确foreach (AccountModel model in accountList){if (model.Account == account && model.Password == password){peerAccountDic.Add(peer, model);return model.ID;}}return 0;}}
    }

模型层

  • 登录注册层

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace PhotonServerFirst.Model
    {/// <summary>/// 账号模型/// </summary>class AccountModel{public int ID;public string Account; public string Password;}
    }

DLC 服务器配置类 发送消息类 以及消息类

  • 服务器配置类

    using Photon.SocketServer;
    using ExitGames.Logging;
    using ExitGames.Logging.Log4Net;
    using log4net.Config;
    using System.IO;namespace PhotonServerFirst
    {public class PSTest : ApplicationBase{//日志需要的public 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        }
    }
  • 服务器面向客户端类

    using System;
    using System.Collections.Generic;
    using Net;
    using Photon.SocketServer;
    using PhotonHostRuntimeInterfaces;
    using PhotonServerFirst.Bll;namespace PhotonServerFirst
    {public class PSpeer : ClientPeer{public PSpeer(InitRequest initRequest) : base(initRequest){}//处理客户端断开的后续工作protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail){//关闭管理器BLLManager.Instance.accountBLL.OnDisconnect(this);}//处理客户端的请求protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters){var dic = operationRequest.Parameters;//转为PhotonMessageMessage message = new Message();message.Type = (byte)dic[0];message.Command = (int)dic[1];List<object> objs = new List<object>();for (byte i = 2; i < dic.Count; i++){objs.Add(dic[i]);}message.Content = objs.ToArray();//消息分发switch (message.Type){case MessageType.Type_Account:BLLManager.Instance.accountBLL.OnOperationRequest(this, message); break;case MessageType.Type_User:break;}}}
    }
  • 消息类

    因为这个类是unity和服务器端都需要有的,所以最好生成为dll文件放进unity(net3.5以下)

    namespace Net
    {public class Message{public byte Type;public int Command;public object Content;public Message() { }public Message(byte type, int command, object content){Type = type;Command = command;Content = content;}}//消息类型public class MessageType{public const byte Type_Account = 1;public const byte Type_User = 2;//注册账号public const int Account_Register = 100;public const int Account_Register_Res = 101;//登陆public const int Account_Login = 102;public const int Account_Login_res = 103;}
    }
  • 发送消息类

    using Photon.SocketServer;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace PhotonServerFirst
    {class SendMessage{/// <summary>/// 发送消息/// </ summary>/// <param name = "peer"> 连接对象 </ param >/// < param name="type">类型</param>/// <param name="command"> 命令</param>/// <param name = "objs" > 参数 </ param > public static void Send(PSpeer peer, byte type,int command,params object[] objs){Dictionary<byte, object> dic = new Dictionary<byte, object>(); dic.Add(0, type);dic.Add(1, command);byte i = 2;foreach (object o in objs){dic.Add(i++,o);}EventData ed = new EventData(0, dic);peer.SendEvent(ed, new SendParameters());}}  
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/59436.html

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

相关文章

Windows安装Redis

自己电脑做个测试&#xff0c;需要用到Redis&#xff0c;把安装过程记录下&#xff0c;方便有需要的人 1、找到下载地址&#xff1a;Releases microsoftarchive/redis GitHub Windows的Redis需要到GitHub上下载&#xff1a; 2、下载完后设置密码&#xff0c;打开文件夹&…

mysql二进制方式升级8.0.34

一、概述 mysql8.0.33 存在如下高危漏洞&#xff0c;需要通过升级版本修复漏洞 Oracle MySQL Cluster 安全漏洞(CVE-2023-0361) mysql/8.0.33 Apache Skywalking <8.3 SQL注入漏洞 二、查看mysql版本及安装包信息 [rootlocalhost mysql]# mysql -V mysql Ver 8.0.33 fo…

【Spring】Bean的作用域和生命周期

目录 一、引入案例来探讨Bean的作用域 二、Bean的作用域 2.1、Bean的6种作用域 2.2、设置Bean的作用域 三、Spring的执行流程 四、Bean的声明周期 1、生命周期演示 一、引入案例来探讨Bean的作用域 首先我们创建一个User类&#xff0c;定义一个用户信息&#xff0c;在定义…

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取数…

【Axure教程】移动端二级滑动选择器

今天教大家制作移动端二级滑动选择器的原型模板&#xff0c;该原型已全国一二级省市选择器为案例&#xff0c;因为该原型用中继器做的&#xff0c;所以制作完成之后使用也很方便&#xff0c;只需修改中继器表格里的内容即可 一、效果展示 1. 拖动选择 2. 快捷选择 【原型预览…

微信小程序 map地图(轨迹)

allMarkers效果图 废话少说直接上马&#xff08;最后是我遇到的问题&#xff09; cover-view是气泡弹窗&#xff0c;可以自定义弹窗&#xff0c;要配合js&#xff1a;customCallout&#xff0c;如果是非自定义的话&#xff1a;callout&#xff08;可以修改颜色、边框宽度、圆角…

【Winform学习笔记(六)】warning MSB3274:引用dll版本冲突

warning MSB3274&#xff1a;引用dll版本冲突 前言正文1、解决方法 前言 在本文中主要介绍 解决 类库编译 Warning MSB3274 的方法&#xff1b; 在项目中引用了自定义控件库&#xff0c;界面设计时可以正常放置删除控件&#xff0c;但启动时会报异常&#xff1b; 编译提示&…

《Zookeeper》从零开始学Zookeeper源码(二)之数据序列化与通信协议

目录 序列化与反序列化通信协议请求头的数据结构响应头的数据结构 序列化与反序列化 zookeeper的客户端与服务端、服务端与服务端之间会进行一系列的网络通信&#xff0c;在进行数据的传输过程中就涉及到序列化与反序列化&#xff0c;zookeeper使用Jute作为它的序列化组件&…

Python-OpenCV中的图像处理-图像轮廓

Python-OpenCV中的图像处理-图像轮廓 轮廓什么是轮廓查找轮廓绘制轮廓 轮廓特征图像的矩轮廓面积轮廓周长&#xff08;弧长&#xff09;轮廓近似凸包轮廓边界矩形 轮廓 什么是轮廓 轮廓可以简单认为成将连续的点&#xff08;连着边界&#xff09;连在一起的曲线&#xff0c;具…

Flutter系列文章-实战项目

在本篇文章中&#xff0c;我们将通过一个实际的 Flutter 应用来综合运用最近学到的知识&#xff0c;包括保存到数据库、进行 HTTP 请求等。我们将开发一个简单的天气应用&#xff0c;可以根据用户输入的城市名获取该城市的天气信息&#xff0c;并将用户查询的城市列表保存到本地…

redis的缓存更新策略

目录 三种缓存更新策略 业务场景&#xff1a; 主动更新的三种实现 操作缓存和数据库时有三个问题 1.删除缓存还是更新缓存&#xff1f; 2.如何保证缓存与数据库的操作的同时成功或失败&#xff1f; 3.先操作缓存还是先操作数据库&#xff1f; 缓存更新策略的最佳实践方案&am…

【效率提升—Python脚本】根据Verilog文件自动生成tb文件

文章目录 Verilog端口文件&#xff08;仅做示范用&#xff09;对应的tb文件相应代码 在数字IC设计过程中&#xff0c;根据顶层生成testbench时存在很多重复性工作&#xff0c;因此为了提高工作效率&#xff0c;特地开发此脚本。 Verilog端口文件&#xff08;仅做示范用&#xf…