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);
}
}
}
有需要学习视频的欢迎关注微信公众号