TIPS:
本系列貼僅用于博主學(xué)習(xí)ET框架的記錄
學(xué)習(xí)ET框架的第一種前后端通信。IRequest和IResponse
ET框架使用protobuf進行前后端的通信。
Protobuf即Protocol Buffers,是Google公司開發(fā)的一種跨語言和平臺的序列化數(shù)據(jù)結(jié)構(gòu)的方式,是一個靈活的、高效的用于序列化數(shù)據(jù)的協(xié)議。與XML和JSON格式相比,Protobuf更小、更快、更便捷。
在ET框架的目錄下有一個Proto文件夾,文件夾中有三個Proto文件(消息體都寫在這三個文件里):
分別為:
InnerMessage.proto:用于服務(wù)器之間的通信。
MongoMessage.proto:也用于服務(wù)器之間的通信,不過參數(shù)可以帶Entity實體。
二、前后端的通信使用 1.編寫protobuf消息體OuterMessage.proto:用于服務(wù)器和客戶端之間的通信。
在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。
代碼命名規(guī)為:
C2S:代表是從Client to Server的一條消息,后面接著//IRequest則表明是一條請求消息,有請求則會有響應(yīng),在上方標(biāo)識ResponseType是S2C。如果是一條請求的消息體,則以下字段是必須的,且值一定要等于90。:
int32 RpcId = 90;
S2C:代表從Server to Client的一條消息,后面接著//IResponse則表明是一條響應(yīng)消息體。如果是一條響應(yīng)的消息體,則以下的字段是必須的,且值為90-92:
int32 RpcId = 90;
int32 Error = 91;
string Message = 92;
其他自定義的值則從1開始,但不能重復(fù)。最后保存文件回到Proto文件下雙擊bat文件會在代碼里生成對應(yīng)的代碼。
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
{//創(chuàng)建一個session鏈接
session = zoneScene.GetComponent().Create(NetworkHelper.ToIPEndPoint(address));
//給服務(wù)器發(fā)送一條消息并拿到服務(wù)器的響應(yīng)消息
s2CTestProtoResponse =
(S2C_TestProtoResponse) await session.Call(new C2S_TestProtoRequest() {RequestText = "Hello server, i am client" });
Log.Debug(s2CTestProtoResponse.ResponseText);//輸出服務(wù)器的響應(yīng)消息
}
finally
{session?.Dispose();//關(guān)閉鏈接
}
}
catch (Exception e)
{Console.WriteLine(e);
throw;
}
// try
// {// // 創(chuàng)建一個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();
// }
//
// // 創(chuàng)建一個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下創(chuàng)建一個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);//輸出客戶端請求的消息
//編輯響應(yīng)消息
response.ResponseText = "Copy that client, i am server";
reply();//reply可以當(dāng)作把消息發(fā)出去
await ETTask.CompletedTask;//由于方法是異步的,這個就是可以消除async帶來的報錯
}
}
}
3.運行結(jié)果對于IRequest的消息處理類要繼承AMRpcHandler類,兩個參數(shù)分別為兩個對應(yīng)的消息體,同時實現(xiàn)Run方法。
保存代碼重新編譯一下代碼,通過后運行服務(wù)器端,并且回到Unity編輯器按下F5等待編譯完成后運行游戲,點擊登錄按鈕即可發(fā)送消息。
這時候就可以看到有兩條消息體,一條是client發(fā)給server的,一條是server響應(yīng)給client的,同時輸出了服務(wù)器端響應(yīng)的消息,而客戶端請求的消息則要到ET文件夾下的Logs文件夾中查看Debug日志。
簡單學(xué)習(xí)一下ET前后端的通信的使用。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧