NetMessage的创建
作用:每次发送消息,都发送这个类,接收到消息后,转换成这个类
自己理解:加上模块号,保证收发消息的准确性,方便接收处理,在脚本中有两个操作码,操作码对应游戏中某个模块,子操作码就对应游戏模块中的子模块。比如:登陆模块中的注册模块。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace MyServer
{/// <summary>/// 网络消息类/// 作用:每次发送消息,都发送这个类,接收到消息后,转换成这个类/// </summary>public class NetMsg{/// <summary>/// 操作码(模块(登陆模块、UI模块等))/// </summary>public int opCode { get; set; }/// <summary>/// 子操作码(模块中的子模块)/// </summary>public int subCode { get; set; }/// <summary>/// 传递的参数/// </summary>public object value { get; set; }/// <summary>/// 构造函数/// </summary>public NetMsg() { }public NetMsg(int opCode, int subCode, object value){this.opCode = opCode;this.subCode = subCode;this.value = value;}/// <summary>/// 改变方法,可以传递到不同的模块和不同的数据,NetMsg是属于构造方法,每次调用的话在new的时候才会调用/// </summary>public void Change(int opCode, int subCode, object value){this.opCode = opCode;this.subCode = subCode;this.value = value;}}
}

NetMessage的处理

  • 在构造类中添加,把字节数组转换成NetMessage类,需要用到序列化,把object转换为byte数组
  • 把NetMessage转换为字节数组,需要用到反序列化,把字节数组转换为object类型。

在EncodeTools类中添加对NetMessage的处理

  /// <summary>/// 将NetMsg类转换成字节数组,发送出去/// </summary>public static byte[] EncodeMsg(NetMsg msg){using (MemoryStream ms = new MemoryStream()){using (BinaryWriter bw = new BinaryWriter(ms)){bw.Write(msg.opCode);//写入操作码bw.Write(msg.subCode);//写入子操作码if (msg.value!=null)//发送的数据是否为空{bw.Write(EncodeObj(msg.value));//写入发送的数据   EncodeObj序列化,把obj类型的转换为字节数组}byte[] data = new byte[ms.Length];//ms.GetBuffer() 写入的所有的数据Buffer.BlockCopy(ms.GetBuffer(), 0, data, 0, (int)ms.Length);return data;}}}/// <summary>/// 将数据转换成NetMsg类/// </summary>/// <param name="data"></param>/// <returns></returns>public static NetMsg DecodeMsg(byte[] data){using (MemoryStream ms = new MemoryStream(data)){using (BinaryReader br = new BinaryReader(ms)){NetMsg netMsg = new NetMsg();netMsg.opCode = br.ReadInt32();//操作码、子操作码为4个字节 netMsg.subCode = br.ReadInt32();if (ms.Length - ms.Position > 0){//使用反序列化 把字节数组转换成object类型object obj = DecodeObj(br.ReadBytes((int)(ms.Length - ms.Position)));netMsg.value = obj;}return netMsg;}}}/// <summary>/// 把Object类型的转换成byte数组(序列化)/// </summary>/// <returns></returns>private static byte[] EncodeObj(object obj){using (MemoryStream ms = new MemoryStream()){BinaryFormatter bf = new BinaryFormatter();bf.Serialize(ms, obj);//序列化byte[] data = new byte[ms.Length];Buffer.BlockCopy(ms.GetBuffer(), 0, data, 0, (int)ms.Length);return data;}}/// <summary>/// 字节转换成Obj(反序列)/// </summary>/// <param name="data"></param>/// <returns></returns>private static object DecodeObj(byte[] data){using (MemoryStream ms=new MemoryStream(data)){BinaryFormatter bf = new BinaryFormatter();return bf.Deserialize(ms);}}}

有需要学习视频的欢迎关注微信公众号

Zjh游戏(二)网络消息类NetMessage的处理相关推荐

  1. Zjh游戏(五)模块类的实现

    完善网络消息的处理中心 作用:分发到各自对应的模块去处理 在GameServer中创建一个文件夹Logo 创建一个所有的模块类继承的接口,IHandler,一个断开方法,一个接收消息的方法 创建操作码 ...

  2. 积目在网络诈骗类黑产对抗的防控与思考

    导读:本文主要介绍积目风控负责人徐铭老师,在对抗黑灰产中的一些心得.实践经验,希望通过分享,能给大家带来一些新的思路和方法.本文将首先介绍关于积目app和主要风险点.其次是遇到的一些共性问题及总体对抗 ...

  3. 【2021年4月游戏行业网络关注度榜】航海王成爆款

    2021年4月,中国游戏行业亮点颇多.新浪游戏联合微热点大数据研究院推出<2021年4月游戏网络关注度分析报告>,以下是报告详情: 4月最热手游--王者荣耀 根据微热点大数据研究院& ...

  4. 【Android开发】消息处理类(Handler)与消息类(Message)介绍

    一.消息处理类(Handler)简介 消息处理类Handler允许发送和处理Message或Runnable对象到其所在线程的MessageQueue中.Handler主要有一下两个作用: 1.将Me ...

  5. 《炉石传说》建筑设计欣赏(7):采用Google.ProtocolBuffers处理网络消息

    这一次,琢磨了一下Unity3D网络游戏发展的网络信息处理.服务器的网络游戏一般都是自主研发,因此,相应的网络消息处理应该培养自己.client/现在使用的邮件服务器之间的价差JSON和Google. ...

  6. 计算机网络抓包参考文献,计算机网络课程设计二(网络抓包与分析)

    <计算机网络课程设计二(网络抓包与分析)>由会员分享,可在线阅读,更多相关<计算机网络课程设计二(网络抓包与分析)(9页珍藏版)>请在人人文库网上搜索. 1.课程设计课程名称: ...

  7. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装...

    微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...

  8. c语言编写可乐瓶游戏,可乐瓶游戏二十则

    <可乐瓶游戏二十则>由会员分享,可在线阅读,更多相关<可乐瓶游戏二十则(2页珍藏版)>请在人人文库网上搜索. 1.可乐瓶游戏二十则废弃的可乐瓶如果能合理地开发与运用,将创编出各 ...

  9. java打字游戏和解析_java类与对象案例之打字游戏

    类与对象案例-童年回忆之打字游戏 一.玩家类 二.等级类 三.游戏类 四.等级地图 五.测试类 这次要做的案例是一个打字游戏的案例,相信大家小时候都玩过金山打字通的警察抓小偷和飞机大战,这次的案例是类 ...

最新文章

  1. Scala Learn 1 Basic
  2. Docker最全教程——从理论到实战(一)
  3. 使用Git将我的最后一个X提交一起压缩
  4. 廖雪峰团队最新研磨的实战宝典终终终终终终于免费了!
  5. python官方推荐的三本书-一个合格的python程序员,应该从这三本书入手
  6. html图片重叠在一排,【CSS】使用浮动进行图片排列却不能使图片在同一行
  7. bpython bs4用哪个解释器好_针对python爬虫bs4(BeautifulSoup)库的基础问题
  8. DataGridView 添加ComboBox
  9. js aes加密_nodejs中使用Crypto-JS对图片进行加解密
  10. [CQOI2015]选数(杜教筛)
  11. HTML元素显示与隐藏
  12. springboot+Mybatis-plue自动生成代码
  13. exit函数_Linux进程间通信详解(三) 消息队列及函数
  14. 自学python顺序-Python学习之调换顺序
  15. pytorch_GPU安装
  16. 下载和安装R、RStudio !~~~
  17. 考研 |高等数学 Chapter 1
  18. 加解密QQ旋风和迅雷链接地址
  19. flex布局对行内子元素的影响
  20. 解决Failed to load module canberra-gtk-module错误

热门文章

  1. Qt实现密码输入框隐藏密码_小眼睛显示密码功能
  2. linux查看那些服务器,查看linux服务器基本信息
  3. GB/T28181国标视频监控平台TINYGBS支持4G执法记录仪接入大型可视指挥调度平台
  4. 35、查询所有学生的课程及分数情况(重点)
  5. android+多处理器+ios,ios与安卓的区别 浅谈ios为什么比安卓流畅 (2)
  6. B+树与B树的区别、Hash索引与B+树索引的区别
  7. 火狐浏览器扩展之三大下载利器
  8. atoi函数的使用和实现
  9. 干货!C++程序的耦合性设计
  10. 阿里巴巴和四十大盗(背包问题)