紧接任务3写编码的接口,也就是把这些成员组装成要发送的数据在 byte[]
文章目录
1)用BitConverter.GetBytes()将数据转为byte类型
2)Array.Copy()将数据填充入
3)若包是ACK包,则什么都不用做;否则是 业务数据包,追加业务的具体数据到包里
4)数据一是返回数组数据,而是存在全局变量buffer里面
5)代码
using System.Net; //用了public IPEndPoint endPoint;要加
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//先建立命名空间
namespace Game.Net
{
public class BufferEntity
{
public int recurCount = 0; //记录重发次数,工程内部用到(记录网络拥塞),并非业务数据
public IPEndPoint endPoint; //发送的目标终端,里面记录了IP和端口
public int protoSize; //协议大小,用于确认报文的完整性
public int session; //会话ID,用于识别客户端的唯一性
public int sn; //序号,用于保证报文的顺序
public int moduleID; //模块ID,把报文传递给对应模块/程序
public long time; //发送时间,用于判断是否超时
public int messageType; //协议类型,区分协议的细节(比如101要登录,102要注册)
public int messageID; //协议ID,用于区分业务
public byte[] proto; //业务报文,记录业务数据
//需要一个字段全部组装成一个byte数组,作为发送的字段
public byte[] buffer; //最终要发送的数据 或者是 收到的数据
//创建一个请求报文的接口,用构造函数
//第一个参数是我们要发送的终端,第二个参数是会话ID,第三个参数是序号,以此类推
public BufferEntity(IPEndPoint endPoint,int session,int sn,int moduleID,int messageType,int messageID,byte[] proto)
{
protoSize = proto.Length; //业务数据大小
this.endPoint = endPoint;
this.session = session;
this.sn = sn;
this.moduleID = moduleID;
this.messageType = messageType;
this.proto = proto;
}
//编码的接口,把这些成员组装成要发送的数据,也就是 byte[]
//编码有两种格式,一种是ACK确认报文,一种是业务报文
//ACK不需要带上包体,只需要带上序号
//以后发送数据就用这个接口
public byte[] Encoder(bool isAck)
{
//上面的数据加起来有32个字节
byte[] data = new byte[32 + protoSize];
//开始往data写入数据,写入之前要把int、long类型转化为byte类型的数据
//BitConverter将各种类型转化为byte类型
byte[] _length = BitConverter.GetBytes(protoSize);
byte[] _session = BitConverter.GetBytes(session);
byte[] _sn = BitConverter.GetBytes(sn);
byte[] _moduleid = BitConverter.GetBytes(moduleID);
byte[] _time = BitConverter.GetBytes(time);
byte[] _messageID = BitConverter.GetBytes(messageID);
byte[] _messageType = BitConverter.GetBytes(messageType);
//要将字节数组,写入到data
//第一个参数是长度,第二个蚕食表示从date的首地址开始写入,
//第三个参数是写入的数据,第四个参数表示在结构体中的数据,第五个参数表示data的大小
Array.Copy(_length, 0, data, 0, 4);
Array.Copy(_session, 0, data, 4, 4);
Array.Copy(_sn, 0, data, 8, 4);
Array.Copy(_moduleid, 0, data, 12, 4);
Array.Copy(_time, 0, data, 16, 8);
Array.Copy(_messageType, 0, data, 24, 4);
Array.Copy(_messageID, 0, data, 28, 4);
//若是ACK包
if (isAck)
{
//如果是ACK,不做任何处理
}
else
{
//如果这个包是业务数据,追加进来
Array.Copy(proto, 0, data, 32, proto.Length);
}
//对全局变量buffer赋值
buffer = data;
return data;
}
}