[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]);
    }
 
 
 
 
 
posted @ 2019-04-30 16:01  NCat  阅读(116)  评论(0)    收藏  举报