ET框架网络通讯消息的编写

发布时间:2024年01月20日

ET框架网络通讯消息的编写

本教程内容来源于UWA的字母哥,基于ET6编写,本教程将其整理成了图文,还有很多可以直接复制的源码,写博客不易还望多多支持

ET框架源码地址https://github.com/egametang/ET

ET社区https://et-framework.cn/

ET服务器Demo的登录流程

在这里插入图片描述

将需要gate网关转发的消息称之为actlocation消息

接下来我们将使用login用例来初步使用网络通讯消息

Login测试用例

ProtoBuf创建消息

进入demo/Proto/ 编写OuterMessage.proto普通消息协议,在这个测试中,我们需要向服务器发送登录请求,服务器验证登录消息然后向客户端回复结果,若登陆成功客户端向服务器发送Hello,当客户端退出登录时又会向服务器发送GoodBye

//Irequest注释:标识该消息需要服务器回复
//C2R 由客户端直接发送给服务器
message C2R_LoginTest   //IRequest
{
     int32 RpcID=90;    //若需要服务器回复就必须加这个变量,标识固定是90.如果不需要服务器回复就不需要这个变量
    string Account=1;
    string Password=2;
}
//IResponse:标识改消息是用来回复客户端请求的
//R2C 由服务器直接发送给客户端
message R2C_LoginTest   //IResponse
{
    int32 RpcID=90;
    int32 Error=91;
    string Message=92;

    //前三条消息是必须要有的

    string GateAddress=1;   //网关地址
    string key=2;
}
//IMessage:不需要回复的消息标识
message C2R_SayHello    //IMessage
{
    string Hello = 1;
}

message C2R_SayGoodBye    //IMessage
{
    string GoodBye = 1;
}

目录内的其它协议
InnerMessage.poto——用于服务器内部进行通讯的消息定义
MongoMessage.poto——也是服务器于服务器之间进行通讯用的,于innerMessage最大的区别在于MongoMessage可以用来传送Entity实体的消息定义文件
OuterMessage.poto——用来定义服务器于客户端进行直连通讯的消息

编写完成后执行该目录下的win_startProtoExport.bat来编译生成消息协议实体,输出proto2cs succeed!字样后代表运行成功

登录方法

打开Demo的源代码,在Client-Server项目中可以找到LoginHelper类,在这里,我们新建一个静态LoginTest方法

public  static async ETTask LoginTest(Scene zoneScene,string addrs){
    Session session =null;  //登录会话
    R2C_LoginTest r2CLogintTest = null;
    try{
        try{
            //从zoneScene中获取当前的网络会话
            session = zoneScene.GetComponent<NetKcpComponent>().Create(NetworkHelper.ToIPEndPoint());
            {
                //Call:服务器处理完之后会回复消息的消息则使用call请求
                //发送登录请求
                 r2CLogintTest=(R2C_LoginTest) await session.Call(new C2R_LoginTest(){Account="".Password=""});

                 Log.Debug(r2CLoginTest.key);
                 //Send:发送消息而不需要回复的消息传递方法
                 //向服务器发送Hello消息
                 session.Send(new C2R_SayHello(){Hello="Hello Server!"})
                 //等待两秒,用于其它请求的响应 
                 await TimerComponent.instance.WaitAsync(2000); 
            }
        }finally{
            session?.Dispose(); //断开会话
        }
    }catch(Exception e){
        Log.Error(e.ToString())
    }

}

服务器处理登陆消息

在Server项目下的Server.Hotfix/Demo下添加一个新目录Login,在该目录下创建C2R_LoginTestHandler,其命名空间在ET下,继承自AMRpcHandler<Message,Message>

namespace ET
{
    [Messagehandle]
    public class C2R_LoginTestHandle : AMRpcHandler<C2R_LoginTest,R2C_LoginTest>{
        //AMRpcHandler接口的虚方法
        protected override async ETTask Run(Session session, C2R_LoginTest request,R2C_Logintest response,Action reply){
            Response.key="1111";//定义消息的具体参数
            replay();//服务器向服务端发回一条消息
            await ETTask.CompletedTask();
        }
    }
}

服务器请求处理逻辑C2R_SayHello的编写

在Server/server.Hotfix/Demo/Login下新建类C2R_SayHello

namespace ET{
    //AMHandler<Message>只负责发送消息
    [MessageHandler]
    public class C2R_SayHello : AMHandler<C2R_SayHello>
    {
        protected override async ETTask Run(Session session,C2R_SayHello message)
        {
            log.Debug(message.Hello);

            session.Send(new R2C_SayGoodBye(){GoodBye="GoodBye"});
            await ETTask.CompletedTask();
        }

    }

}

客户端回应C2R_SayHello

Client-Server/server.Hotfix/Demo/Login下新建R2C_SayGoodByeHandler

namespace ET{
    [MessageHandler]
    public class R2C_SayGoodByeHandler : AMHandler<R2C_SayGoodBye>
    {
        protected override async ETTask Run(Session session,R2C_SayGoodBye message){
            log.Debug(message.GoodBye);
            await ETTask.CompletedTask();
        }
    }
}

调用loginTest

Client-Server/Unity.Hotfix/Codes/Hotfixview/Demo/UI/uiLogin下编写UILoginComponentSystem.cs/UILoginComponentSystem/OnLogin
先注释掉该方法原来的代码,我们重新用LoginTest写一遍

public static void OnLogin(this UILoginComponent self){
    LoginHelper.LoginTest(self.DomainScene(),ConstValue.LoginAddress).Coroutine();
}

编译项目

右键Client-Server编译项目,然后启动Server.app

在unity项目内,在顶部导航栏选择Tools/buildDebug编译源代码

启动游戏

在这里插入图片描述

查看Demo/Logs内的目录文件,查看debug(最底下)

在这里插入图片描述

结语

通过上述案例,我们学习了如何使用et框架进行客户端与服务器的通讯,可以是Gate网关也可以是Realm网关,若是需要gate服务器转发到Map服务器的消息就被称之为Actor消息

下一节课:Actor消息模型

文章来源:https://blog.csdn.net/weixin_43010844/article/details/135699970
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。