GitHub 上有一个存储库,实现了 WebSocket 协议的解码帧。问题是如果同时发送多条消息,浏览器会粘住帧,代码就不能正常工作。
private String DecodeMessageFromClient(Byte[] bytes)
{
try
{
String incomingData = String.Empty;
Byte secondByte = bytes[1];
Int32 dataLength = secondByte & 127;
Int32 indexFirstMask = 2;
if (dataLength == 126) indexFirstMask = 4;
else if (dataLength == 127) indexFirstMask = 10;
IEnumerable<Byte> keys = bytes.Skip(indexFirstMask).Take(4);
Int32 indexFirstDataByte = indexFirstMask + 4;
Byte[] decoded = new Byte[bytes.Length - indexFirstDataByte];
for (Int32 i = indexFirstDataByte, j = 0; i < bytes.Length; i++, j++)
{
decoded[j] = (Byte)(bytes[i] ^ keys.ElementAt(j % 4));
}
return incomingData = Encoding.UTF8.GetString(decoded, 0, decoded.Length);
}
catch (Exception ex)
{
Debug.WriteLine("Could not decode due to :" + ex.Message);
}
return null;
}
根据变量的名称,发生这种情况是因为代码跳过了标头,并将其余信息视为帧的内容。但由于消息中有两帧,因此不会跳过第二个标头。
for (Int32 i = indexFirstDataByte, j = 0; i < bytes.Length; i++, j++)
新代码更难。它接收一个字节数组,从那里选择第一帧并返回未参与解码的剩余字节
它是这样使用的:
以防万一,我将附上读取从浏览器接收到的信息块的扩展代码
您可以从以下链接下载 Visual Studio 的解决方案:https ://cloud.mail.ru/public/KEeF/H81Q22MXP