• 售前

  • 售后

热门帖子
入门百科

Unity注册登录Demo的实现-03(全部完整代码)(客户端、服务端、数据库)

[复制链接]
不好吃荤漳 显示全部楼层 发表于 2022-1-12 22:14:50 |阅读模式 打印 上一主题 下一主题
流程



客户端



服务端







---------------------------------------------------------------------------------------------------------------------------------

客户端

PhotonEngine.cs:差不多算是主类吧,将其构造成单例,到时候方便调用
里面有处理服务端返回的响应的方法,还有接受客户端发来的事件的方法等等。
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using ExitGames.Client.Photon;
  5. using Common;
  6. public class PhotonEngine : MonoBehaviour,IPhotonPeerListener {
  7.     public static PhotonEngine Instance;
  8.     //用字典来缓存每次的请求和码
  9.     //这里就能体现出来我们Request抽象类的好处了,不然每次这边都是不同的类型,使用抽象类就统一了
  10.     private Dictionary<OperationCode, Request> RequestDic = new Dictionary<OperationCode, Request>();
  11.     public static PhotonPeer peer;
  12.     private void Awake()
  13.     {
  14.         if (Instance == null)
  15.         {
  16.             Instance = this;
  17.             //当前Gameobject不会随场景的销毁而销毁
  18.             DontDestroyOnLoad(this.gameObject);
  19.         }
  20.     }
  21.     void Start () {
  22.         peer = new PhotonPeer(this,ConnectionProtocol.Udp);
  23.         peer.Connect("127.0.0.1:5055", "MyGame6");//通过ip连接到到对应的我们config中配置的Allpication
  24.         }
  25.        
  26.         void Update () {
  27.         peer.Service();//开启服务
  28.         }
  29.     private void OnDestroy()//销毁的时候
  30.     {
  31.         if(peer!=null&&peer.PeerState == PeerStateValue.Connected)//如果存在且保持连接状态
  32.         {
  33.             peer.Disconnect();//就断开连接
  34.         }
  35.     }
  36.     public void DebugReturn(DebugLevel level, string message)
  37.     {
  38.     }
  39.     public void OnEvent(EventData eventData)
  40.     {
  41.         switch (eventData.Code)
  42.         {
  43.             case 1:
  44.                 //解析数据
  45.                 var data = eventData.Parameters;
  46.                 object intValue, StringValue;
  47.                 data.TryGetValue(1, out intValue);
  48.                 data.TryGetValue(2, out StringValue);
  49.                 Debug.Log("收到服务器的响应Event推送,OpCode:1" + intValue.ToString() + ":" + StringValue.ToString());
  50.                 break;
  51.             default:
  52.                 break;
  53.         }
  54.     }
  55.     public void OnOperationResponse(OperationResponse operationResponse)
  56.     {
  57.         Request request = null;
  58.         //此处就是工具类
  59.         DicTool.GetValue(RequestDic, (OperationCode)operationResponse.OperationCode)
  60.             .OnOprationRespionse(operationResponse);
  61.         //下面注释的代码可以用上方工具类代替
  62.         //bool b =RequestDic.TryGetValue((OperationCode)operationResponse.OperationCode, out request);
  63.         //if (b)
  64.         //{
  65.         //    request.OnOprationRespionse(operationResponse);
  66.         //}
  67.         //else
  68.         //{
  69.         //    Debug.LogError("未找到对应code的请求request");
  70.         //}
  71.         return;
  72.         //switch (operationResponse.OperationCode)
  73.         //{
  74.         //    case 1:
  75.         //        Debug.Log("收到服务器的响应,OpCode:1");
  76.         //        //解析数据
  77.         //        var data = operationResponse.Parameters;
  78.         //        object intValue;
  79.         //        data.TryGetValue(1, out intValue);
  80.         //        object StringValue;
  81.         //        data.TryGetValue(2, out StringValue);
  82.         //        Debug.Log("收到客户端的请求,OpCode:1" + intValue.ToString() + ":" + StringValue.ToString());
  83.         //        break;
  84.         //            default:
  85.         //                break;
  86.         //        }
  87.         }
  88.     public void OnStatusChanged(StatusCode statusCode)
  89.     {
  90.         Debug.LogError(statusCode);
  91.     }
  92.     //private Dictionary<OperationCode, Request> RequestDic = new Dictionary<OperationCode, Request>();
  93.     public void AddRequest(Request r)
  94.     {
  95.         RequestDic.Add(r.OpCode, r);
  96.     }
  97.     public void RemoveRequest(Request r)
  98.     {
  99.         RequestDic.Remove(r.OpCode);
  100.     }
  101. }
复制代码




Request.cs:抽象了,生命code和request以及对服务器返回的响应的响应response
  1. using Common;
  2. using ExitGames.Client.Photon;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. public abstract class Request: MonoBehaviour
  7. {
  8.     public OperationCode OpCode;
  9.     //抽象方法就是只声明,具体的实现有子类完成
  10.     public abstract void DefaultRequest();
  11.     public abstract void OnOprationRespionse(OperationResponse operationResponse);
  12.     public void Start()
  13.     {
  14.         PhotonEngine.Instance.AddRequest(this);
  15.     }
  16.     public void OnDestroy()
  17.     {
  18.         PhotonEngine.Instance.RemoveRequest(this);
  19.     }
  20. }
复制代码




(登录)LoginRequest.cs:实现了抽象类中的方法
  1. using Common;
  2. using ExitGames.Client.Photon;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. public class LoginRequest : Request
  7. {
  8.     //在unity面板隐藏
  9.     [HideInInspector]
  10.     public string UserName;
  11.     [HideInInspector]
  12.     public string Password;
  13.     public override void DefaultRequest()
  14.     {
  15.         //构造参数
  16.         var data = new Dictionary<byte, object>();
  17.         //构造参数
  18.         data.Add((byte)ParaCode.UserName,UserName);
  19.         data.Add((byte)ParaCode.Password, Password);
  20.         //发送
  21.         PhotonEngine.peer.OpCustom((byte)OpCode, data, true);
  22.     }
  23.     public override void OnOprationRespionse(OperationResponse operationResponse)
  24.     {
  25.         Debug.Log(operationResponse.ReturnCode);
  26.     }
  27. }
复制代码



(登录)LoginPanel.cs:用于获得输入的账号密码,以及点击的时候调用request
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class LoginPanel : MonoBehaviour {
  6.    public GameObject SignPanel;
  7.     void Start() {
  8.      //   SignPanel = GameObject.Find("SignInPanel");
  9.     }
  10.     void Update() {
  11.     }
  12.     public void OnLoginBtn()
  13.     {
  14.         print("OnLoginBtn()");
  15.         var  Request = GetComponent<LoginRequest>();
  16.         Request.UserName = transform.Find("NameField").GetComponent<InputField>().text;
  17.         Request.Password = transform.Find("PWField").GetComponent<InputField>().text;
  18.         Request.DefaultRequest();
  19.     }
  20.     public void OnSign()
  21.     {
  22.         SignPanel.SetActive(true);
  23.         gameObject.SetActive(false);
  24.     }
  25. }
复制代码



(注册)LoginRequest.cs:实现抽象类中的方法
  1. using Common;
  2. using ExitGames.Client.Photon;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. public class LoginRequest : Request
  7. {
  8.     //在unity面板隐藏
  9.     [HideInInspector]
  10.     public string UserName;
  11.     [HideInInspector]
  12.     public string Password;
  13.     public override void DefaultRequest()
  14.     {
  15.         //构造参数
  16.         var data = new Dictionary<byte, object>();
  17.         //构造参数
  18.         data.Add((byte)ParaCode.UserName,UserName);
  19.         data.Add((byte)ParaCode.Password, Password);
  20.         //发送
  21.         PhotonEngine.peer.OpCustom((byte)OpCode, data, true);
  22.     }
  23.     public override void OnOprationRespionse(OperationResponse operationResponse)
  24.     {
  25.         Debug.Log(operationResponse.ReturnCode);
  26.     }
  27. }
复制代码



(注册)LoginPanel.cs:用于获得输入的账号密码,以及点击的时候调用request
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class LoginPanel : MonoBehaviour {
  6.    public GameObject SignPanel;
  7.     void Start() {
  8.      //   SignPanel = GameObject.Find("SignInPanel");
  9.     }
  10.     void Update() {
  11.     }
  12.     public void OnLoginBtn()
  13.     {
  14.         print("OnLoginBtn()");
  15.         var  Request = GetComponent<LoginRequest>();
  16.         Request.UserName = transform.Find("NameField").GetComponent<InputField>().text;
  17.         Request.Password = transform.Find("PWField").GetComponent<InputField>().text;
  18.         Request.DefaultRequest();
  19.     }
  20.     public void OnSign()
  21.     {
  22.         SignPanel.SetActive(true);
  23.         gameObject.SetActive(false);
  24.     }
  25. }
复制代码





---------------------------------------------------------------------------------------------------------------------------------

服务端
其中Nhibernate就不发了,之前的文章里发过了。(有用的)
然后这里面net连接mysql那个文件夹是之前测试用的,这里也不发了。(没用)
就发剩余的了(有用的)




Class1.cs:枚举,我认为这是协议
  1. namespace Common
  2. {
  3.     public enum OperationCode : byte
  4.     {
  5.         Login,
  6.         SignIn
  7.     }
  8.     public enum ParaCode : byte
  9.     {
  10.         UserName,
  11.         Password
  12.     }
  13.     public enum ReturnCode : short
  14.     {
  15.         Success,
  16.         Failed
  17.     }
  18. }
复制代码



DicTools.cs:字典工具类,照着写,拿着用就完事了
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Common
  6. {
  7.     public class DicTool
  8.     {
  9.         public static T2 GetValue<T1,T2>(Dictionary<T1,T2> dic, T1 key)
  10.         {
  11.             T2 value;
  12.             bool isSuccess = dic.TryGetValue(key, out value);
  13.             if (isSuccess)
  14.             {
  15.                 return value;
  16.             }
  17.             else
  18.             {
  19.                 return default(T2);
  20.             }
  21.         }
  22.     }
  23. }
复制代码



BaseHandler.cs:和客户端的Request差不多,都是抽象类。定义code以及抽象方法
  1. using Common;
  2. using Photon.SocketServer;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace RRGameServer.Handler
  9. {
  10.     public abstract class BaseHandler
  11.     {
  12.         public OperationCode OpCode;
  13.         public abstract void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters, ClientPeer peer);
  14.     }
  15. }
复制代码



LoginHandler.cs:拿到登陆的请求,实现抽象类的方法,返回响应
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Common;
  7. using Photon.SocketServer;
  8. using RRGameServer.Manager;
  9. namespace RRGameServer.Handler
  10. {
  11.     class LoginHandler : BaseHandler
  12.     {
  13.         public LoginHandler()
  14.         {
  15.             OpCode = Common.OperationCode.Login;
  16.         }
  17.         //服务端收到客户端的request,并且对其做出响应返回给客户端
  18.         public override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters, ClientPeer peer)
  19.         {
  20.             string username = DicTool.GetValue<byte, object>(operationRequest.Parameters, (byte)ParaCode.UserName) as string;
  21.             string password = DicTool.GetValue<byte, object>(operationRequest.Parameters, (byte)ParaCode.Password) as string;
  22.            bool b= UserManager.Instance.VerifyUser(username, password);
  23.             OperationResponse response = new OperationResponse(operationRequest.OperationCode);
  24.             if (b)
  25.             {
  26.                 response.ReturnCode = (short)Common.ReturnCode.Success;
  27.             }
  28.             else
  29.             {
  30.                 response.ReturnCode = (short)Common.ReturnCode.Failed;
  31.             }
  32.             peer.SendOperationResponse(response, sendParameters);
  33.         }
  34.     }
  35. }
复制代码


SignHandler.cs:拿到注册的请求,实现抽象类的方法,返回响应
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Common;
  7. using Photon.SocketServer;
  8. using RRGameServer.Manager;
  9. using RRGameServer.Model;
  10. namespace RRGameServer.Handler
  11. {
  12.     class SignHandler:BaseHandler
  13.     {
  14.         public SignHandler()
  15.         {
  16.             OpCode = Common.OperationCode.SignIn;
  17.         }
  18.         public override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters, ClientPeer peer)
  19.         {
  20.             string username = DicTool.GetValue<byte, object>(operationRequest.Parameters, (byte)ParaCode.UserName) as string;
  21.             string password = DicTool.GetValue<byte, object>(operationRequest.Parameters, (byte)ParaCode.Password) as string;
  22.             var user = UserManager.Instance.GetUserByName(username);
  23.             OperationResponse response = new OperationResponse(operationRequest.OperationCode);
  24.             if (user==null)
  25.             {
  26.                 user = new User();
  27.                 user.Username = username;
  28.                 user.Password = password;
  29.                 UserManager.Instance.Add(user);
  30.                 response.ReturnCode = (short)Common.ReturnCode.Success;
  31.             }
  32.             else
  33.             {
  34.                 response.ReturnCode = (short)Common.ReturnCode.Failed;
  35.             }
  36.             peer.SendOperationResponse(response, sendParameters);
  37.         }
  38.     }
  39. }
复制代码



UserManager.cs:可以对数据库进行操作,,增删改查以及比对校验啥的
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using NHibernate;
  7. using NHibernate.Criterion;
  8. using RRGameServer.Model;
  9. namespace RRGameServer.Manager
  10. {
  11.     class UserManager
  12.     {
  13.         public static UserManager Instance = new UserManager();
  14.         public void Add(User user)
  15.         {
  16.             //using大括号之间的代码执行完毕之后,()里面的内存就会被回收
  17.             using (ISession session= NHibernateHelper.OpenSession())
  18.             {
  19.                 using (ITransaction transaction = session.BeginTransaction())
  20.                 {
  21.                     session.Save(user);
  22.                     transaction.Commit();
  23.                 }
  24.             }
  25.         }
  26.         public void Update(User user)
  27.         {
  28.             //using大括号之间的代码执行完毕之后,()里面的内存就会被回收
  29.             using (ISession session = NHibernateHelper.OpenSession())
  30.             {
  31.                 using (ITransaction transaction = session.BeginTransaction())
  32.                 {
  33.                     session.Update(user);
  34.                     transaction.Commit();
  35.                 }
  36.             }
  37.         }
  38.         //做用户名和密码的校验
  39.         internal bool VerifyUser(string username, string password)
  40.         {
  41.             using (ISession session = NHibernateHelper.OpenSession())
  42.             {
  43.                 User user= session
  44.                     .CreateCriteria(typeof(User))
  45.                     .Add(Restrictions.Eq("Username", username))
  46.                     .Add(Restrictions.Eq("Password", password))
  47.                     .UniqueResult<User>();
  48.                 if (user == null)
  49.                     return false;
  50.                 return true;
  51.             }
  52.         }
  53.         public void Remove(User user)
  54.         {
  55.             //using大括号之间的代码执行完毕之后,()里面的内存就会被回收
  56.             using (ISession session = NHibernateHelper.OpenSession())
  57.             {
  58.                 using (ITransaction transaction = session.BeginTransaction())
  59.                 {
  60.                     session.Delete(user);
  61.                     transaction.Commit();
  62.                 }
  63.             }
  64.         }
  65.         public User GetUserById(int id)
  66.         {
  67.             //using大括号之间的代码执行完毕之后,()里面的内存就会被回收
  68.             using (ISession session = NHibernateHelper.OpenSession())
  69.             {
  70.                 using (ITransaction transaction = session.BeginTransaction())
  71.                 {
  72.                     var u = session.Get<User>(id);
  73.                     transaction.Commit();
  74.                     return u;
  75.                 }
  76.             }
  77.         }
  78.         public User GetUserByName(string name)
  79.         {
  80.             //using大括号之间的代码执行完毕之后,()里面的内存就会被回收
  81.             using (ISession session = NHibernateHelper.OpenSession())
  82.             {
  83.                 return session.CreateCriteria(typeof(User)).Add(Restrictions.Eq("Username", name)).UniqueResult<User>();
  84.             }
  85.         }
  86.         public IList<User> GetAll()
  87.         {
  88.             //using大括号之间的代码执行完毕之后,()里面的内存就会被回收
  89.             using (ISession session = NHibernateHelper.OpenSession())
  90.             {
  91.                 return session.CreateCriteria(typeof(User)).List<User>();
  92.             }
  93.         }
  94.     }
  95. }
复制代码


User.hbm.xml:配置表,配置与数据库交互
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
  3.                    assembly="RRGameServer"
  4.                    namespace="RRGameServer.Model">
  5.   <!-- more mapping info here -->
  6.   <class name="User" table="users">
  7.     <id name="Id" column="id" type="Int32">
  8.       <generator class="native"></generator>
  9.     </id>
  10.     <property name="Username" column="username" type="string"></property>
  11.     <property name="Password" column="password" type="string"></property>
  12.     <property name="Registerdate" column="registerdate" type="Date"></property>
  13.   </class>
  14.   
  15. </hibernate-mapping>
复制代码


users.cs:用户类,跟NHibernate一起用的
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace RRGameServer.Model
  7. {
  8.     class User
  9.     {
  10.         public virtual int Id { get; set; }
  11.         public virtual string Username { get; set; }
  12.         public virtual string Password { get; set; }
  13.         public virtual DateTime Registerdate { get; set; }
  14.     }
  15. }
复制代码



ClientPeer.cs:处理客户端请求等功能
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Common;
  7. using Photon.SocketServer;
  8. using PhotonHostRuntimeInterfaces;
  9. using RRGameServer.Handler;
  10. namespace RRGameServer
  11. {
  12.     public class ClientPeer : Photon.SocketServer.ClientPeer
  13.     {
  14.         public ClientPeer(InitRequest initRequest) : base(initRequest)
  15.         {
  16.         }
  17.         //当每个客户端断开时
  18.         protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
  19.         {
  20.             
  21.         }
  22.         //当客户端发起请求的时候
  23.         protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
  24.         {
  25.             BaseHandler handler = DicTool.GetValue(MyGameServer.Instance.HandlerDic, (OperationCode)operationRequest.OperationCode);
  26.             if (handler != null)
  27.             {
  28.                 handler.OnOperationRequest(operationRequest, sendParameters,this);
  29.             }
  30.             else
  31.             {
  32.                 MyGameServer.log.Info("找不到操作码:" + (OperationCode)operationRequest.OperationCode);
  33.             }
  34.             return;
  35.             //switch (operationRequest.OperationCode)
  36.             //{
  37.             //    case 1:
  38.             //        //解析数据
  39.             //        var data = operationRequest.Parameters;
  40.             //        object intValue;
  41.             //        data.TryGetValue(1, out intValue);
  42.             //        object StringValue;
  43.             //        data.TryGetValue(2, out StringValue);
  44.             //        //输出参数
  45.             //        MyGameServer.log.Info("收到客户端的请求,opcode:1"+intValue.ToString()+":"+StringValue.ToString());
  46.             //        //返回响应
  47.             //        OperationResponse opResponse = new OperationResponse(operationRequest.OperationCode);
  48.             //        //构造参数
  49.             //        var data2 = new Dictionary<byte, object>();
  50.             //        data2.Add(1, 100);
  51.             //        data2.Add(2, "这是服务端做的响应");
  52.             //        opResponse.SetParameters(data2);
  53.             //        //返回code,为发送过来的code,返回的参数,为发送过来的参数
  54.             //        SendOperationResponse(opResponse, sendParameters);
  55.             //        //推送一个Event
  56.             //        EventData ed = new EventData(1);
  57.             //        ed.Parameters = data2;
  58.             //        SendEvent(ed, new SendParameters());
  59.             //        break;
  60.             //    default:
  61.             //        break;
  62.             //}
  63.         }
  64.     }
  65. }
复制代码



hibernate.cfg.xml:配置用户连接数据库啥的
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  3.   <session-factory>
  4.     <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
  5.     <property name="dialect">NHibernate.Dialect.MsSqlCeDialect</property>
  6.     <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
  7.     <property name="connection.connection_string">server=localhost;port=3306;database=gamedb;user=root;password=root</property>
  8.     <property name="show_sql">true</property>
  9.   </session-factory>
  10. </hibernate-configuration>
复制代码



MyGameServer.cs:主类,用于初始化字典,以及服务器的响应初始化,以及日志等操作。
(重要!)(●'◡'●)
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using Common;
  8. using ExitGames.Logging;
  9. using ExitGames.Logging.Log4Net;
  10. using log4net.Config;
  11. using Photon.SocketServer;
  12. using RRGameServer.Handler;
  13. using RRGameServer.Manager;
  14. namespace RRGameServer
  15. {
  16.     //所有的Server,都要继承ApplicationBase,然后实现ApplicationBase的三个方法
  17.     public class MyGameServer : ApplicationBase
  18.     {
  19.         public static MyGameServer Instance;
  20.         public static readonly ILogger log = LogManager.GetCurrentClassLogger();
  21.         //当有一个客户端连接上以后,就会执行此方法
  22.         protected override PeerBase CreatePeer(InitRequest initRequest)
  23.         {
  24.             log.Info("一个客户端连接");
  25.             return new ClientPeer(initRequest);
  26.         }
  27.         //服务器初始化函数
  28.         protected override void Setup()
  29.         {
  30.             Instance = this;
  31.             log4net.GlobalContext.Properties["Photon:ApplicationLogPath"] = Path.Combine(
  32.                 Path.Combine(this.ApplicationRootPath, "bin_Win64"), "log");
  33.             FileInfo configFileInfo = new FileInfo(Path.Combine(this.BinaryPath, "log4net.config"));
  34.             if (configFileInfo.Exists)
  35.             {
  36.                 LogManager.SetLoggerFactory(Log4NetLoggerFactory.Instance);//photon知道日志输出
  37.                 XmlConfigurator.ConfigureAndWatch(configFileInfo);//读取配置
  38.             }
  39.             log.Info("服务器启动啦");
  40.             //log.Info(UserManager.Instance.GetUserById(7).Username);
  41.             InitHandler();//初始化
  42.         }
  43.         //服务器关闭函数
  44.         protected override void TearDown()
  45.         {
  46.             log.Info("服务器关闭啦");
  47.         }
  48.         public Dictionary<OperationCode, BaseHandler> HandlerDic = new Dictionary<OperationCode, BaseHandler>();
  49.         public void InitHandler()
  50.         {
  51.             //一开始就全部初始化
  52.             LoginHandler LH = new LoginHandler();
  53.             //log.Info("初始化操作码:" + LH.OpCode);
  54.             HandlerDic.Add(LH.OpCode, LH);
  55.             SignHandler handler = new SignHandler();
  56.             HandlerDic.Add(handler.OpCode, handler);
  57.         }
  58.     }
  59. }
复制代码



NHibernateHelper.cs:会话工厂,用于搞Nhibernate的那玩意,直接用就完事了。
  1. using NHibernate;
  2. using NHibernate.Cfg;
  3. using RRGameServer.Model;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace RRGameServer
  10. {
  11.     class NHibernateHelper
  12.     {
  13.         private static ISessionFactory _sessionFactory;
  14.         private static ISessionFactory sessionFactory
  15.         {
  16.             get
  17.             {
  18.                 if (_sessionFactory == null)
  19.                 {
  20.                     var cfg = new Configuration();
  21.                     cfg.Configure();//解析配置文件
  22.                     cfg.AddAssembly("RRGameServer");
  23.                     _sessionFactory = cfg.BuildSessionFactory();
  24.                 }
  25.                 return _sessionFactory;
  26.             }
  27.         }
  28.         public static ISession OpenSession()
  29.         {
  30.             return sessionFactory.OpenSession();
  31.         }
  32.     }
  33. }
复制代码


最后效果也懒得贴图了,就是unity的客户端和服务端以及数据库三者打通了。
客户端注册,服务端接受到注册,判断有没有,与数据库做对比,如果有的话,返回失败。如果没有,添加到数据库,返回给客户端成功。然后客户端在根据返回的码,做相应的操作。
客户端登陆,服务端接收到登录,判断账号密码和数据库里面是否相同,如果相同,返回成功,如果不同,返回失败。然后客户端在根据返回的码,做相应的操作。

基本上就三个函数,一个requst是客户端发送给服务端的请求。然后服务端会有一个response函数,用于接受客户端发过来的请求,并且你在处理这个请求的时候,还可以掉个api给客户端发回去你的处理结果。然后第三个函数是客户端用于接受服务端传回来的响应的函数,可以根据传回来的响应,做一些操作,比如弹出成功登录的页面啥的呀。
(●'◡'●)
( •̀ ω •́ )y
呜呜终于一个人配置、搭建、搞通了客户端和服务端还有数据库,搭建了架构QAQ



来源:https://blog.caogenba.net/Weirdo_ran/article/details/122413570
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作