文章目录

  • 1.首先我们将消息分为两类
    • 1.1 普通消息
    • 1.2 ActLocation的消息
  • 2.编写网络通讯消息
    • 2.1 进入LoginHelper.cs编写代码
    • 2.2 进入Proto文件夹
    • 2.3 普通消息写在OuterMessage.proto
      • 2.3.1需要回复的消息
      • 2.3.2 不需要回复的普通消息
    • 2.4 进入LoginHelper.cs完善代码
      • 2.4.1 消息请求
      • 2.4.2 回复消息
    • 2.5进入Client编写客户端接受消息
  • 3.调用我们编写的网络通讯代码
  • 4.运行代码
  • 5.总结

1.首先我们将消息分为两类

1.1 普通消息

直接发送给游戏服务器,发送给黄色的Realm网关负载均衡服务器

1.2 ActLocation的消息

必须要经过Gate网关转发的消息,图中绿色的部分
转发到具体的Map游戏服务器,然后由游戏服务器处理之后再返回到Gate网关,然后将消息返回到客户端

2.编写网络通讯消息

2.1 进入LoginHelper.cs编写代码

public static async ETTask LoginTest(Scene zoneScene,string address){try{//客户端与服务端交互是使用SessionSession session = null;try{//创建连接用的Sessionsession = zoneScene.GetComponent<NetKcpComponent>().Create(NetworkHelper.ToIPEndPoint(address));}finally{}}catch (Exception e){//异常就log出去Log.Error(e.ToString());}}

2.2 进入Proto文件夹

2.3 普通消息写在OuterMessage.proto

编写一个游戏 客户端 发送给 服务端(Realm网关负载均衡服务器)的第一条普通消息
普通消息是不经过网关服务器的,所以和 服务器 是直连关系

这样的普通消息写在OuterMessage.proto里面

2.3.1需要回复的消息

如果我们需要服务器返回我们客户端的消息,则我们应该定义一个RpcId,同时后面加上// IRequest,代表这条消息服务器必须要回复
//response R2C_LoginTest,代表指定一个回复类型

名字这里是C2R,代表 客户端Realm网关负载均衡服务器
注意:‘=’ 旁边得有空格

//ResponseType R2C_LoginTest
message C2R_LoginTest // IRequest
{int32 RpcId = 90;string Account = 1;string Password = 2;
}message R2C_LoginTest // IResponse
{int32 RpcId = 90;int32 Error = 91;string Message = 92;string GateAddress = 1;string key  = 2;
}

2.3.2 不需要回复的普通消息

message C2R_SayHello // IMessage
{string Hello = 1;
}message R2C_SayGoodBye // IMessage
{string GoodBye = 1;
}

2.4 进入LoginHelper.cs完善代码

2.4.1 消息请求

public static async ETTask LoginTest(Scene zoneScene,string address){try{//客户端与服务端交互是使用SessionSession session = null;R2C_LoginTest r2C_LoginTest = null;try{//创建连接用的Sessionsession = zoneScene.GetComponent<NetKcpComponent>().Create(NetworkHelper.ToIPEndPoint(address));{//调用Call命令发送登录请求 需要回复  await 就是一直在等待回复r2C_LoginTest = (R2C_LoginTest)await session.Call(new C2R_LoginTest() { Account = "", Password = "" });//等待到服务器回复Log.Debug(r2C_LoginTest.key);//send发送消息给服务器  不需要回复session.Send(new C2R_SayHello() { Hello = "Hello Server!" });}}finally{}}catch (Exception e){//异常就log出去Log.Error(e.ToString());}}

2.4.2 回复消息

创建一个文件夹,以及一个脚本,专门处理这个事件
记得名字后面加Handler,代表处理
这是ET命名规范

回复 C2R_LoginTest

namespace ET
{//这里继承了AMRpcHandler,这个类就具有了向客户端回复普通消息的能力[MessageHandler]internal class C2R_LoginTestHandler : AMRpcHandler<C2R_LoginTest, R2C_LoginTest>{//session表示服务器的session , request是客户端的,response是服务器的,reply是Act委托protected override async ETTask Run(Session session, C2R_LoginTest request, R2C_LoginTest response, Action reply){//设置回复的keyresponse.key = "111111111111111";//回复的Act委托reply();//异步变同步await ETTask.CompletedTask;}}
}

**回复 C2R_SayHello **

namespace ET
{[MessageHandler]public class C2R_SayHelloHandler : AMHandler<C2R_SayHello>{protected override async ETTask Run(Session session, C2R_SayHello message){Log.Debug(message.Hello);//这里我们主动让服务器发送一条消息给客户端session.Send(new R2C_SayGoodBye() { GoodBye = "byebye" });await ETTask.CompletedTask;}}
}

至此,我们创建了两个脚本来分别处理两个消息

2.5进入Client编写客户端接受消息

我们这里处理的是
R2C_SayGoodBye 服务端发送给客户端的消息

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

3.调用我们编写的网络通讯代码

我们进入我们在 LoginHelper.cs 编写的代码
我们找到调用Login的地方

我们取消默认的Login函数的调用
改为调用我们的LoginTest

     public static void OnLoginClickHandler(this DlgLogin self){//LoginHelper.Login(//   self.DomainScene(), //  ConstValue.LoginAddress, // self.View.E_AccountInputField.GetComponent<InputField>().text, // self.View.E_PasswordInputField.GetComponent<InputField>().text).Coroutine();//我们注释掉默认的Login函数,使用我们自己的LoginHelper.LoginTest(self.DomainScene(),ConstValue.LoginAddress).Coroutine();}

4.运行代码

我们首先全部生成解决方法

然后BuildCode

启动服务器,运行Unity

然后运行Unity

我们来分析结果

Unity客户端Log
1.我们发送了一条C2R_LoginTest的消息
2.我们发送了一条R2C_LoginTest的语句
3.我们输出了1111111
4.我们发送了一条C2R_SayHello的语句
5.我们发送了一条R2C_SayGoodBye的语句
6.我们输出了byebye

我们进入服务器的Logs

5.总结

我们现在已经学会了普通消息的发送
不仅仅是需要服务器响应的消息
还有不需要回复的消息
我们都使用了

ET框架-13 网络通讯消息的编写相关推荐

  1. matlab网络通讯消息响应,nevoVI FIRE——实现PC与CAN和LIN网络通信

    6个CAN通道,4个LIN通道,高级 LIN和 CAN分析,支持7个通用端口,其中4个端口可用于模拟输入,1个数字端口可产生PWM信号,另一个可以测量PWM信号.支持单机模式运行. 6x CAN, 4 ...

  2. cocos2d-x3.2与服务端框架Firefly的网络编程(初级网络通讯)

    好久没写东西,最近在研究服务端框架Firefly和Pomelo,身为菜鸟的我的确花了很大功夫才看懂一些源代码.原来打算玩下Pomelo,不过我不得不说这东西真的是给专业开发者准备的,我搞了半天libp ...

  3. 开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一]

    开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一] 1. 简介 1.1 结识Lidgren的机缘巧合 开发Unity的各位或多或少都可能在工作中遇到非客户端开发的一些内容.大型 ...

  4. ET框架-15 Actor消息的编写 以及 ET框架实战之前的准备工作

    文章目录 1.Actor消息的编写 2. 进入LoginHelper.cs编写代码 3. 发送消息给服务端Map 3.1 我们在SceneChangeHelper里面添加我们的Actor消息 4. 对 ...

  5. 网络通讯面试题及答案

    文章目录 1. BIO 与 NIO 的区别 2. select 与 poll 的区别 3.请概述 OSI 网络模型 4. TCP 和 UDP 的区别 5.请概述 TCP 的三次握手四次挥手机制 6.为 ...

  6. day06--java高级编程:多线程,枚举类,注解,反射,网络通讯

    1 Day16–多线程01 1.1 程序概念 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 1.2 进程 1.2.1 概念 进程(proce ...

  7. 用C#实现基于TCP协议的网络通讯

    TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实 ...

  8. C#.NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示)

    C#.NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示) 作者:一点一滴的Beer http://beer.cnblogs.com/ 在程序设计中,涉及数据存储和数据交换的时候 ...

  9. 【转】dicom网络通讯入门(3)

    转自: dicom网络通讯入门(3) - assassinx - 博客园 接下来可以进行消息传递了 ,也就是dimse ,再来复习下 什么是dimse .n-set  n-create c-echo ...

最新文章

  1. CI流水线配置文件参数详解(一)
  2. 一对多,多对一,多对多的关系
  3. C和汇编混合编程---do while
  4. ArrayBuffer和TypedArray,以及Blob的使用
  5. project facets中没有dynamic_C++强制类型转换操作符 dynamic_cast
  6. OpenCV和java做人脸识别
  7. 代码智能:问题与解法
  8. 苹果电脑python编译器_Mac版-python环境配置(二):编译器pycharm下载安装
  9. 新浪微博开放平台PHP 类 WeiboClient 说明
  10. 【牛客网】马三来刷题之串的模式匹配
  11. python爬虫可视化excel_Python爬虫以及数据可视化分析!
  12. 【使用教程】VSCode创建json文件
  13. 实时票房 麦谈帮API数据接口
  14. NSIS进阶教程(一)~(五)
  15. 关于开发中遇到的一些问题记录
  16. Element UI设置文本输入框、选择框、数字、日期组件的背景色
  17. 前端知识——js部分
  18. POJ 1654 乱搞题?
  19. 消防无线图像传输系统解决方案
  20. 十二届蓝桥杯省赛c++(下)

热门文章

  1. OpenStack GlanceCinder Havana版本的新变化 (by quqi99)
  2. Tusimple-benchmark-data
  3. 项目管理 | 项目风险识别都有哪些方法?
  4. 太极熊猫服务器怎么都在维护,太极熊猫3月8日战区调整及维护公告
  5. mysql 外键(foreign key)的详解和实例
  6. 脱离标准流(2)定位
  7. php对接小鹅通API开发高级实战案例解析:获取指定资源学习记录信息(单人单学习记录、单人多学习记录累计、返回数据格式确认)
  8. git commit 模板设置
  9. iptables网页劫持重定向
  10. 2023年网络安全国赛规程样题(具体请看官网)