C#开源网络通信库PESocket的使用


前言

学习自SIKI学院教程(《暗黑战神》3D网游ARPG实战案例)

PESocket

PESocket
基于C#语言实现的高效便捷网络库。支持集成到Unity当中使用。
不用过多了解网络通信内部原理,只需几行简单的代码,便能简捷快速开发基于C#语言的服务器和客户端,实现网络通信。

打开PESocket解决方案
在这里插入图片描述
在NetMsg里修改IP地址为本地(一般如下)
在这里插入图片描述
两种方法使用PESocket插件(这里使用第一种):
1.使用他编译出来的dll直接在代码里引用(修改可以直接重新生成)
2. 直接复制源文件
在这里插入图片描述
右键属性-生成-更改路径-重新生成解决方案
生成后如图

服务器使用PESocket

创建

  1. 新建一个项目,删除默认创建的项目及文件(资源管理器中的也要删掉)
    在这里插入图片描述
  2. 新建一个服务器工程(框架保持默认)
    在这里插入图片描述
  3. 服务器需要与客户端进行通信,需要一个协议(类库)
    创建协议
  4. 右键属性修改协议框架如下
    修改协议框架
    分别将项目里的名字改成"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");
    }
}

在游戏中的使用方法后续补充,有不对的地方望指出!

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值