Socket
安全
之前我们用的
Socket
是包的长度加包体内容
/// <summary>
/// 封装数据包
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
private byte[] MakeData(byte[] data)
{
byte[] retBuffer = null;
using (MMO_MemoryStream ms = new MMO_MemoryStream())
{
ms.WriteUShort((ushort)data.Length);
ms.Write(data, 0, data.Length);
retBuffer = ms.ToArray();
}
return retBuffer;
}
然后,我们对数据进行安全加密,这里就需要我们从新处理一下我们这个数据包了,因为传输的数据要具有一定的安全性,所以就要对其内容多加一下处理,
1
还是要标明咱们的包的总长度
2
这里我们做一个压缩的处理,游戏数据太大我们就需要进行压缩处理
3CRC16
效验,这是用来判断我们收到的数据是否具有完整性,还有是否被修改过
4
然后在用
Xor
异或对内容再次进行加密
5
异或之后的数据就是咱们真正需要的数据
具体代码如下
这里是封装数据包
private byte[] MakeData(byte[] data)
{
byte[] retBuffer = null;
//1,如果数据包的长度大于m_CompressLen 则进行压缩
bool isCompress = data.Length > m_CompressLen ? true : false;
if (isCompress)
{
byte[] compressBuffer = ZlibHelper.CompressBytes(data);
}
//2先异或
data = SecurityUtil.Xor(data);
//3Crc效验
ushort crc = Crc16.CalculateCrc16(data);
using (MMO_MemoryStream ms = new MMO_MemoryStream())
{
ms.WriteUShort((ushort)(data.Length + 3));
ms.WriteBool(isCompress);
ms.WriteUShort(crc);
ms.Write(data, 0, data.Length);
retBuffer = ms.ToArray();
}
return retBuffer;
}
然后咱们需要把这些数据进行解析
using (MMO_MemoryStream ms = new MMO_MemoryStream(buffer))
{
//判断是否压缩
isCompress = ms.ReadBool();
//crc
crc = ms.ReadUShort();
ms.Read(bufferNew, 0, bufferNew.Length);
}
int newCrc = Crc16.CalculateCrc16(bufferNew);
if (newCrc == crc)
{
//异或 得到原始数据
bufferNew=SecurityUtil.Xor(buffer);
if (isCompress)
{
bufferNew =ZlibHelper.DeCompressBytes(bufferNew);
}
ushort protoCode = 0;
byte[] protoContent = null;
using (MMO_MemoryStream ms = new MMO_MemoryStream(buffer))
{
//协议编号
protoCode = ms.ReadUShort();
ms.Read(protoContent, 0, protoContent.Length);
EventDispatcher.Instance.Dispatch(protoCode, protoContent);
}
}
else
{
break;
}
以上是客户端的代码,服务端的代码和客户端的是一样的,这里我就不写了