ToB企服应用市场:ToB评测及商务社交产业平台

标题: Unity网络开发 - C#开源网络通信库PESocket的使用 [打印本页]

作者: 冬雨财经    时间: 2024-11-1 04:00
标题: Unity网络开发 - C#开源网络通信库PESocket的使用
概述

在现代多人在线游戏中,稳定且高效的网络通信是确保游戏体验的关键。本文将探讨如何使用C#开源网络通信库PESocket来构建一个简单的Unity客户端与.NET控制台服务器之间的实时消息传递系统。通过本例,读者不仅能够了解PESocket的根本用法,还将学到一些关于计划跨平台网络应用程序的最佳实践。
1. PESocket简介

   PESocket开源项目GitHub地点:点击跳转
  博客地点:C#开源网络通信库PESocket的使用 - PlaneZhong - 博客园 (cnblogs.com)
  PESocket是一个轻量级、易于使用的网络通信框架,特别得当于快速原型制作和小规模项目。它基于Socket编程模型,并提供了简洁的API以简化异步数据传输过程。
  不用过多了解网络通信内部原理,只需几行简单的代码,便能简捷快速开发基于C#语言的服务器和客户端,实现网络通信。
  2. 序列化与反序列化

为了在网络间安全高效地传输复杂对象,PESocket采用了自定义的序列化机制。这使得任何实现了ISerializable接口或标志了[Serializable]属性的数据结构都可以被直接打包成二进制流发送出去,到达目标地后再恢复为原始情势。
3. 会话管理

每个连接到服务器的客户端都由一个独立的PESession实例代表,负责处理所有相关的输入输出操作。这种一对一的关系有助于实现更细粒度的安全控制及错误处理策略。
4. 日志记载

精良的日志记载习惯对于调试和维护网络应用至关重要。PESocket内置了一套强大的日志系统,可以根据差别级别(如信息、告诫、错误等)记载详细的运行时状态变革。
开发步骤

第一步:设置项目情况


第二步:定义通信协议

服务器必要与客户端进行通信,必要一个网络协议(类库)

首先,我们必要定义一个共享的消息类,用于封装待交换的信息。此例中我们仅包罗了一个字符串字段text,但根据实际需求可以扩展更多属性。
  1. // NetMsg.cs
  2. using PENet;
  3. using System;
  4. namespace PEProtocal
  5. {
  6.     [Serializable]
  7.     public class NetMsg : PEMsg
  8.     {
  9.         public string text;
  10.     }
  11.     public class IPCfg
  12.     {
  13.         public const string srvIP = "127.0.0.1";
  14.         public const int srvPort = 17666;
  15.     }
  16. }
复制代码
第三步:编写服务器端代码

接下来创建服务器逻辑,包罗初始化监听器以及处理来自长途主机的各种事件。

有了ip端口信息就可以在服务器(ServerStart)里天生一个PESocket
但由于PESocket必要有一个进行网络通信的Session,并且这个Session必要继承自PESession
在服务器下创建一个session(类):ServerSession
   ServerSession负责与客户端进行连接
连接后需做
1.建立连接时必要有一个反馈
2.收到数据时对数据进行处理
3.断开连接时打出一个反馈日志
  1. using Protocal;
  2. using PENet;
  3. /// <summary>
  4. /// ServerSession负责与客户端进行连接
  5. /// </summary>
  6. public class ServerSession:PESession<NetMsg>//PESession需要传入网络消息的类
  7. {
  8.     //建立连接
  9.     protected override void OnConnected()
  10.     {
  11.         PETool.LogMsg("Client Connect");//PESocket里封装好的方法
  12.         SendMsg(new NetMsg
  13.         {
  14.             text = "Welcome to connect."
  15.         });
  16.     }
  17.     //收到数据
  18.     protected override void OnReciveMsg(NetMsg msg)
  19.     {
  20.         PETool.LogMsg("Client Req:" + msg.text);
  21.         SendMsg(new NetMsg
  22.         {
  23.             text = "SrvRsp:" + msg.text
  24.         });
  25.     }
  26.     //断开连接
  27.     protected override void OnDisConnected()
  28.     {
  29.         PETool.LogMsg("Client DisConnect");
  30.     }
  31. }
复制代码
  在服务器端,ServerStart 类是整个应用的入口点。它负责初始化网络通佩服务,并保持服务器运行状态以便一连监听来自客户端的连接哀求。 
  1. using PENet;
  2. using Protocal;
  3. /// <summary>
  4. /// 服务器
  5. /// </summary>
  6. namespace Server
  7. {
  8.     class ServerStart
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             //需要一个进行网络通信的Session,并且这个Session需要继承自PESession,还有一个网络消息的类(协议)
  13.             PESocket<ServerSession, NetMsg> server = new PESocket<ServerSession, NetMsg>();
  14.             server.StartAsServer(IPCfg.srvIP, IPCfg.srvPort);
  15.             //需要传递的ip和端口
  16.             while (true)
  17.             {
  18.                 /* Keep the application running */
  19.             }
  20.         }
  21.     }
  22. }
复制代码
第四步:设置Unity客户端

现在转向Unity工程,在MonoBehaviour脚本中添加必要的逻辑以便建立与远端服务的链接并发送/接收文本消息。
将协议工程导出(给客户端使用)
属性-天生 更改路径 天生-重新天生解决方案
unity里直接导入PESocket与协议dll
客户端也必要一个Session
   Session 用来和客户端进行连接,每个客户端对应一个session(只用关联自己),服务器对应多个客户端(有多个session)  
  1. using PENet;
  2. using Protocal;
  3. using UnityEngine;
  4. public class ClientSession:PESession<NetMsg>
  5. {
  6.     //建立连接
  7.     protected override void OnConnected()
  8.     {
  9.         //PETool.LogMsg("Server Connect");//PESocket里封装好的方法,在控制台输出
  10.         Debug.Log("Server Connect");
  11.     }
  12.     //收到数据
  13.     protected override void OnReciveMsg(NetMsg msg)
  14.     {
  15.         //PETool.LogMsg("Server Rsp:" + msg.text);
  16.         Debug.Log("Server Rsp:" + msg.text);
  17.     }
  18.     //断开连接
  19.     protected override void OnDisConnected()
  20.     {
  21.         //PETool.LogMsg("Server DisConnect");
  22.         Debug.Log("Server DisConnect");
  23.     }
  24. }
复制代码
  GameStart 类,用于管理游戏对象的举动逻辑。这个脚本重要关注于建立与服务器的连接、设置日志记载以及处理用户输入以发送消息给服务器。
  1. using UnityEngine;
  2. using Protocal;
  3. public class GameStart : MonoBehaviour
  4. {
  5.     PENet.PESocket<ClientSession, NetMsg> client = null;
  6.     private void Start()
  7.     {
  8.         client = new PENet.PESocket<ClientSession, NetMsg>();
  9.         client.StartAsClient(IPCfg.srvIP, IPCfg.srvPort);
  10.         //启动客户端
  11.         //指定一个日志的接口,可以把PESocket里的日志通过unity控制台打印;
  12.         //(日志是否开启,日志的回调函数(内容,日志的级别(?)))
  13.         client.SetLog(true, (string msg, int lv) =>
  14.          {
  15.              switch (lv)//对不同的日志级别显示不同的提示
  16.             {
  17.                  case 0:
  18.                      msg = "Log:" + msg;
  19.                      Debug.Log(msg);
  20.                      break;
  21.                  case 1://警告
  22.                      msg = "Warn:" + msg;
  23.                      Debug.Log(msg);
  24.                      break;
  25.                  case 2://错误
  26.                      msg = "Error:" + msg;
  27.                      Debug.Log(msg);
  28.                      break;
  29.                  case 3://普通信息
  30.                      msg = "Info:" + msg;
  31.                      Debug.Log(msg);
  32.                      break;
  33.              }
  34.          });
  35.     }
  36.     private void Update()
  37.     {
  38.         if (Input.GetKeyDown(KeyCode.Space))
  39.         {
  40.             client.session.SendMsg(new NetMsg { text = "Hello Unity" });
  41.         }
  42.     }
  43. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4