C#开源网络通信库PESocket的使用
文章目录
- 前言
- PESocket
- 服务器使用PESocket
- 创建
- 引用
- 客户端(Unity)使用PESocket
- 代码
- 服务器
- NetMsg
- ServerStart
- ServerSession
- 客户端
- GameStart
- ClientSession
前言
学习自SIKI学院教程(《暗黑战神》3D网游ARPG实战案例)
PESocket
PESocket
基于C#语言实现的高效便捷网络库。支持集成到Unity当中使用。
不用过多了解网络通信内部原理,只需几行简单的代码,便能简捷快速开发基于C#语言的服务器和客户端,实现网络通信。
- 下载PESocket
GitHub地址:https://github.com/PlaneZhong/PESocket - 介绍网络库(防止学校访问外网波动)
博客园地址:https://www.cnblogs.com/planezhong/p/10074676.html
打开PESocket解决方案
在NetMsg里修改IP地址为本地(一般如下)
两种方法使用PESocket插件(这里使用第一种):
1.使用他编译出来的dll直接在代码里引用(修改可以直接重新生成)
2. 直接复制源文件
右键属性-生成-更改路径-重新生成解决方案
服务器使用PESocket
创建
- 新建一个项目,删除默认创建的项目及文件(资源管理器中的也要删掉)
- 新建一个服务器工程(框架保持默认)
- 服务器需要与客户端进行通信,需要一个协议(类库)
- 右键属性修改协议框架如下
分别将项目里的名字改成"NetMsg"与"ServerStart",(ServerSession后面加的,这里命名随意)
引用
网络协议必须要去继承自PESocket里的PEMsg
服务器里PESocket 放在网络模块
将协议里原来的引用都删除-添加引用-找到之前生成的PESocket.dll
将原来服务器里的引用都删除-添加引用-直接引用协议项目
有了ip端口信息就可以在服务器(ServerStart)里生成一个PESocket
但由于PESocket需要有一个进行网络通信的Session,并且这个Session需要继承自PESession
在服务器下创建一个session(类):ServerSession
ServerSession负责与客户端进行连接
连接后需做
1.建立连接时需要有一个反馈
2.收到数据时对数据进行处理
3.断开连接时打出一个反馈日志
using Protocal;
using PENet;/// <summary>
/// ServerSession负责与客户端进行连接
/// </summary>
public class ServerSession:PESession<NetMsg>//PESession需要传入网络消息的类
{//建立连接protected override void OnConnected(){PETool.LogMsg("Client Connect");//PESocket里封装好的方法SendMsg(new NetMsg{text = "Welcome to connect."});}//收到数据protected override void OnReciveMsg(NetMsg msg){PETool.LogMsg("Client Req:" + msg.text);SendMsg(new NetMsg{text = "SrvRsp:" + msg.text});}//断开连接protected override void OnDisConnected(){PETool.LogMsg("Client DisConnect");}}
客户端(Unity)使用PESocket
将协议工程导出(给客户端使用)
属性-生成 更改路径 生成-重新生成解决方案
unity里直接导入PESocket与协议dll
客户端也需要一个Session
Session 用来和客户端进行连接,每个客户端对应一个session(只用关联自己),服务器对应多个客户端(有多个session)
代码
服务器
NetMsg
using PENet;
using System;/// <summary>
/// 服务器需要与客户端进行通信,需要一个协议
/// </summary>
namespace Protocal
{[Serializable]//这条消息需要在网络中进行传输,需要转化为二进制public class NetMsg:PEMsg{public string text;}//确定当前服务器的ip和端口public class IPCfg{public const string srvIP = "127.0.0.1";public const int srvPort = 17666;}
}
ServerStart
using PENet;
using Protocal;/// <summary>
/// 服务器
/// </summary>
namespace Server
{class ServerStart{static void Main(string[] args){//需要一个进行网络通信的Session,并且这个Session需要继承自PESession,还有一个网络消息的类(协议)PESocket<ServerSession, NetMsg> server = new PESocket<ServerSession, NetMsg>();server.StartAsServer(IPCfg.srvIP, IPCfg.srvPort);//需要传递的ip和端口while (true){}}}
}
ServerSession
using Protocal;
using PENet;/// <summary>
/// ServerSession负责与客户端进行连接
/// </summary>
public class ServerSession:PESession<NetMsg>//PESession需要传入网络消息的类
{//建立连接protected override void OnConnected(){PETool.LogMsg("Client Connect");//PESocket里封装好的方法SendMsg(new NetMsg{text = "Welcome to connect."});}//收到数据protected override void OnReciveMsg(NetMsg msg){PETool.LogMsg("Client Req:" + msg.text);SendMsg(new NetMsg{text = "SrvRsp:" + msg.text});}//断开连接protected override void OnDisConnected(){PETool.LogMsg("Client DisConnect");}}
客户端
GameStart
using UnityEngine;
using Protocal;public class GameStart : MonoBehaviour
{PENet.PESocket<ClientSession, NetMsg> client = null;private void Start(){client = new PENet.PESocket<ClientSession, NetMsg>();client.StartAsClient(IPCfg.srvIP, IPCfg.srvPort);//启动客户端//指定一个日志的接口,可以把PESocket里的日志通过unity控制台打印;//(日志是否开启,日志的回调函数(内容,日志的级别(?)))client.SetLog(true, (string msg, int lv) =>{switch (lv)//对不同的日志级别显示不同的提示{case 0:msg = "Log:" + msg;Debug.Log(msg);break;case 1://警告msg = "Warn:" + msg;Debug.Log(msg);break;case 2://错误msg = "Error:" + msg;Debug.Log(msg);break;case 3://普通信息msg = "Info:" + msg;Debug.Log(msg);break;}});}private void Update(){if (Input.GetKeyDown(KeyCode.Space)){client.session.SendMsg(new NetMsg{text = "Hello Unity"});}}
}
ClientSession
using PENet;
using Protocal;
using UnityEngine;public class ClientSession:PESession<NetMsg>
{//建立连接protected override void OnConnected(){//PETool.LogMsg("Server Connect");//PESocket里封装好的方法,在控制台输出Debug.Log("Server Connect");}//收到数据protected override void OnReciveMsg(NetMsg msg){//PETool.LogMsg("Server Rsp:" + msg.text);Debug.Log("Server Rsp:" + msg.text);}//断开连接protected override void OnDisConnected(){//PETool.LogMsg("Server DisConnect");Debug.Log("Server DisConnect");}
}
在游戏中的使用方法后续补充,有不对的地方望指出!
C#开源网络通信库PESocket的使用相关推荐
- 爱上开源之网络通信库boot4go-fastnet,简单而不乏高能
准备在物联网中间件这块做一些创新的产品, 故先提前准备了剥离出以后自己御用的底层tcp通讯的网络库boot4go-fastnet. boot4go-fastnet项目简单,主要代码大小不足20K,但是 ...
- Linux下常用的C/C++开源Socket库
1. Linux Socket Programming In C++ : http://tldp.org/LDP/LG/issue74/tougher.html 2. ACE: h ...
- ESP32开源驱动库Easyio的使用,基于ESP-IDF开发框架,非Arduino
Easyio 是一款适配于ESP-IDF框架的开源驱动库,以支持ESP32的简便开发.目的是简化乐鑫ESP-IDF开发框架的使用难度.(真要方便的话,有现成的Arduino和Platform可以用 ...
- 搜索算法,一触即达:GitHub上有个规模最大的开源算法库
视学算法报道 编辑:杜伟 赶紧去试试吧! 我们知道,算法本质上是一套规则,它接受一个或多个输入,然后执行内部计算和数据操作,返回一个或多个输出.从复杂的数据操作和哈希,到简单运算,算法通过一系列步骤来 ...
- python库开源网站_开源Python库
开源Python库 Python 一个很受人欢迎的原因之一是其有很丰富的第三方库,到本文开始写的时候已经在 PyPI 上有108298个第三方包提供.有人还对第三方库做了很好的总结 Awesome P ...
- 脚本没有类似C语言的预编译,开源脚本库
开源脚本库 1 TinyC(TCC) 1.1 优点 1.1.1 速度快:直接x86汇编代码 1.1.2 标准C支持:支持标准的 ANSI C 语言,而且也支持 ISO C99 标准 1.2 缺点 1. ...
- 【深度学习】基于Torch的Python开源机器学习库PyTorch卷积神经网络
[深度学习]基于Torch的Python开源机器学习库PyTorch卷积神经网络 文章目录 1 CNN概述 2 PyTorch实现步骤2.1 加载数据2.2 CNN模型2.3 训练2.4 可视化训练 ...
- 【深度学习】基于Torch的Python开源机器学习库PyTorch回归
[深度学习]基于Torch的Python开源机器学习库PyTorch回归 文章目录1 torch.autograd 2 torch.nn.functional 3 详细的回归DEMO3.1 DATAS ...
- 【深度学习】基于Torch的Python开源机器学习库PyTorch概述
[深度学习]基于Torch的Python开源机器学习库PyTorch概述 文章目录 1 PyTorch简介 2 环境搭建 3 Hello world!3.1 Tensors (张量)3.2 操作 4 ...
最新文章
- DPI — nDPI — Overview
- HDU 5025:Saving Tang Monk(BFS + 状压)
- 因果关系和相关关系 大数据_数据科学中的相关性与因果关系
- sklearn——AdaBoost应用
- matlab求解lmi,Matlab的LMI工具箱中最优化问题
- 使用mysql命令还原student表_自用mysql自带命令实现数据库备份还原的方法
- centos7卸载docker_新手快速入门Docker,轻松掌握Docker安装与使用
- ERROR:STATUS_BROM_CMD_SEND_DA_FALL(0xC0060003)
- 计算机无法备份,iTunes无法备份是怎么回事?iTunes无法备份怎么解决?
- 爬虫返回乱码以及解决办法以及锟斤拷、ISO-8859-1转码、#、#x转码、unicode转码,gbk转码,ascii转码
- 清理或破坏病毒流氓若干
- 彻悟人生555句金玉良言
- JAVA毕业设计vue健康餐饮管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
- Python数据分析与可视化(基础知识)Python基础
- 深入理解Seq2seq模型(Sequence2sequence)
- NLP-中文、英文分词
- 计算机毕业设计Java物流车辆规费管理系统的设计与实现(源码+系统+mysql数据库+Lw文档)
- 2020茶艺师(中级)模拟考试及茶艺师(中级)模拟考试题库
- AutoSAR的入门知识
- java判断任意两数的最小公倍数和最大公约数
热门文章
- 常见的7种软件规模估算方法 优劣势比较
- 搜狗手机浏览器测试管理方法(一)
- python控制机械臂6轴_基于Firmata协议的ROS Moveit六轴机械臂设计
- 在html中文本框不可编辑状态,input框不可编辑_怎么让Html文本框不可编辑
- Linux-定时任务(备份)-进程管理-后台screen管理-ssh
- 关键字工具有哪些功能!?
- 游戏王决斗连接显示服务器错误,游戏王决斗链接进不去 国服常见问题解决方案...
- 19章 位运算与进制转换
- excel中的常用技巧_在Excel中控制技巧
- Markdown转Html应用与实践