05-ET框架的前后端通信1-创新互联-成都快上网建站

05-ET框架的前后端通信1-创新互联

TIPS:
本系列贴仅用于博主学习ET框架的记录

博兴ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!

文章目录
  • 前言
  • 一、ET框架的前后端如何进行通信的?
  • 二、前后端的通信使用
    • 1.编写protobuf消息体
    • 2.编写C#代码
    • 3.运行结果
  • 总结


前言

学习ET框架的第一种前后端通信。IRequest和IResponse


一、ET框架的前后端如何进行通信的?

ET框架使用protobuf进行前后端的通信。

Protobuf即Protocol Buffers,是Google公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。与XML和JSON格式相比,Protobuf更小、更快、更便捷。

在ET框架的目录下有一个Proto文件夹,文件夹中有三个Proto文件(消息体都写在这三个文件里):
在这里插入图片描述
分别为:

InnerMessage.proto:用于服务器之间的通信。

MongoMessage.proto:也用于服务器之间的通信,不过参数可以带Entity实体。

OuterMessage.proto:用于服务器和客户端之间的通信。

二、前后端的通信使用 1.编写protobuf消息体

在OuterMessage.proto文件中编写代码:

//ResponseType S2C_TestProtoResponse
message C2S_TestProtoRequest // IRequest
{
	int32 RpcId       = 90;
	string RequestText = 1;
}

message S2C_TestProtoResponse // IResponse
{
	int32 RpcId = 90;
	int32 Error = 91;
	string Message = 92;

	string ResponseText = 1;
}

ET框架的前后端通信拥有几种方式,这篇先记录IRequest、IResponse。

代码命名规为:
C2S:代表是从Client to Server的一条消息,后面接着//IRequest则表明是一条请求消息,有请求则会有响应,在上方标识ResponseType是S2C。如果是一条请求的消息体,则以下字段是必须的,且值一定要等于90。:

int32 RpcId = 90;

S2C:代表从Server to Client的一条消息,后面接着//IResponse则表明是一条响应消息体。如果是一条响应的消息体,则以下的字段是必须的,且值为90-92:

int32 RpcId = 90;
int32 Error = 91;
string Message = 92;

其他自定义的值则从1开始,但不能重复。最后保存文件回到Proto文件下双击bat文件会在代码里生成对应的代码。

2.编写C#代码

(1)找到LoginHelper.cs文件下的Login方法开始编写,先注释掉原先的代码:

using System;


namespace ET
{public static class LoginHelper
    {public static async ETTask Login(Scene zoneScene, string address, string account, string password)
        {try
            {S2C_TestProtoResponse s2CTestProtoResponse = null;
                Session session = null;
                try
                {//创建一个session链接
                    session = zoneScene.GetComponent().Create(NetworkHelper.ToIPEndPoint(address));
                    //给服务器发送一条消息并拿到服务器的响应消息
                    s2CTestProtoResponse =
                            (S2C_TestProtoResponse) await session.Call(new C2S_TestProtoRequest() {RequestText = "Hello server, i am client" });
                    Log.Debug(s2CTestProtoResponse.ResponseText);//输出服务器的响应消息
                }
                finally
                {session?.Dispose();//关闭链接
                }
            }
            catch (Exception e)
            {Console.WriteLine(e);
                throw;
            }
            // try
            // {//     // 创建一个ETModel层的Session
            //     R2C_Login r2CLogin;
            //     Session session = null;
            //     try
            //     {//         session = zoneScene.GetComponent().Create(NetworkHelper.ToIPEndPoint(address));
            //         {//             r2CLogin = (R2C_Login) await session.Call(new C2R_Login() { Account = account, Password = password });
            //         }
            //     }
            //     finally
            //     {//         session?.Dispose();
            //     }
            //
            //     // 创建一个gate Session,并且保存到SessionComponent中
            //     Session gateSession = zoneScene.GetComponent().Create(NetworkHelper.ToIPEndPoint(r2CLogin.Address));
            //     gateSession.AddComponent();
            //     zoneScene.AddComponent().Session = gateSession;
				        //
            //     G2C_LoginGate g2CLoginGate = (G2C_LoginGate)await gateSession.Call(
            //         new C2G_LoginGate() { Key = r2CLogin.Key, GateId = r2CLogin.GateId});
            //
            //     Log.Debug("登陆gate成功!");
            //
            //     Game.EventSystem.PublishAsync(new EventType.LoginFinish() {ZoneScene = zoneScene}).Coroutine();
            // }
            // catch (Exception e)
            // {//     Log.Error(e);
            // }
        }
}

(2)编写处理消息的类,在Server/Server.Hotfix/Demo下创建一个Login文件夹,并且新建一个C2S_TestProtoRequestHandler.cs类。用来说明该类是处理C2S_TestProtoRequest的消息请求的。

using System;

namespace ET
{public class C2S_TestProtoRequestHandler : AMRpcHandler{protected override async ETTask Run(Session session, C2S_TestProtoRequest request, S2C_TestProtoResponse response, Action reply)
        {Log.Debug(request.RequestText);//输出客户端请求的消息

            //编辑响应消息
            response.ResponseText = "Copy that client, i am server";

            reply();//reply可以当作把消息发出去

            await ETTask.CompletedTask;//由于方法是异步的,这个就是可以消除async带来的报错
        }
    }
}

对于IRequest的消息处理类要继承AMRpcHandler类,两个参数分别为两个对应的消息体,同时实现Run方法。

3.运行结果

保存代码重新编译一下代码,通过后运行服务器端,并且回到Unity编辑器按下F5等待编译完成后运行游戏,点击登录按钮即可发送消息。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这时候就可以看到有两条消息体,一条是client发给server的,一条是server响应给client的,同时输出了服务器端响应的消息,而客户端请求的消息则要到ET文件夹下的Logs文件夹中查看Debug日志。
在这里插入图片描述


总结

简单学习一下ET前后端的通信的使用。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:05-ET框架的前后端通信1-创新互联
当前地址:http://kswjz.com/article/dohcjc.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流