[WebSocket] websocket 协议

第一个字节:
最高位用来描述消息是否结束,如果为1,标示该消息为消息的尾部,如果为0则还有后续的数据包;后三位为扩展定义的,如果没有扩展约定的情况则必须传0,通过C#代码得到相应值:
mDataPackage.IsEof = (data[index] >> 7) > 0; |
最低四位用来描述消息的类型,消息类型暂定15种。其中有几种是预留类型,通过C#代码得到相应值:
int type = data[index] & 0xF;mDataPackage.Type = (PackageType)type; 第二个字节:
第二个字节主要用来描述掩码和消息长度,最高位用0或1表示是否有掩码处理,可以通过C#代码得到相应的值:
bool hasMask = (data[index] >>7) > 0;剩下的后7位用来描述消息长度,由于7位最多可描述127,所以这个值会代表三种情况,一种是消息小于126存储消息长度;另外一种是等于126的存储消息长度;最后一种为等于127消息长度。可以通过C#代码得到相应值:
mPackageLength = (uint)(data[start] & 0x7F);start++;if (mPackageLength == 126){ mPackageLength = BitConverter.ToUInt16(data, start); start = start + 2;}else if (mPackageLength == 127){ mPackageLength = BitConverter.ToUInt64(data, start); start = start + 8;}如果存在掩码的情况下,获取4位掩码值:
if (hasMask){ mDataPackage.Masking_key = new byte[4]; Buffer.BlockCopy(data, start, mDataPackage.Masking_key, 0, 4); start = start + 4; count = count - 4;} 获取消息体:
当得到消息体长度后就可以获取对应的长度的byte[],有些消息是没有长度的,如:denotes a connection close,对于Text文本类型的消息,对应的byte[]是相应字符的UTF-8编码,获取消息体另外一个注意的地方是掩码,如果存在掩码情况下接收byte[]要做如下转换处理:
if (mDataPackage.Masking_key != null) { int length = mDataPackage.Data.Count; for (var i = 0; i < length; i++) mDataPackage.Data.Array[i] = (byte)(mDataPackage.Data.Array[i] ^ mDataPackage.Masking_key[i % 4]); }
真正的大师永远怀着一颗学徒的心。

浙公网安备 33010602011771号