文章目录
前言
学习自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");
}
}
在游戏中的使用方法后续补充,有不对的地方望指出!