带有 C# WebSocket 服务器错误 1006 的 JS WebSocket 客户端
JS WebSocket client with C# WebSocket Server error 1006
我正在尝试将一些数据从用 C# 编写的服务器发送到用 JS 编写的浏览器客户端。当我发送 12900 字节大小的消息时,一切正常。如果我将发送大小为 67990 字节的消息,那么在服务器端我将不会收到任何错误,而在客户端我将收到断开连接错误 1006,没有其他解释。我在某处找不到与消息大小相关的任何限制。这是我尝试发送数据的 C# 代码。
byte[] data =getDecodedMessage(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(dataResponse)));
stream.Write(data, 0, data.Length);
基于question user3892585 answer,我在 WebSocket 数据传输的编码函数中用 bytesRaw.LongLength
替换了 bytesRaw.Length
。这样做后我没有收到套接字错误。
public static byte[] getEncodedMessage(byte[] bytesRaw)
{
List<byte> bytesFormatted = new List<byte>();
bytesFormatted.Add(129);
int indexStartRawData = -1; // it doesn't matter what value is
// set here - it will be set now:
if (bytesRaw.LongLength <= 125)
{
bytesFormatted.Add(Convert.ToByte(bytesRaw.LongLength));
indexStartRawData = 2;
}
else if (bytesRaw.LongLength >= 126 && bytesRaw.LongLength <= 65535)
{
bytesFormatted.Add(126);
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 8) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength) & 255));
indexStartRawData = 4;
}
else
{
bytesFormatted.Add(127);
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 56) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 48) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 40) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 32) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 24) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 16) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 8) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength) & 255));
indexStartRawData = 10;
}
// put raw data at the correct index
bytesFormatted.InsertRange(indexStartRawData, bytesRaw);
return bytesFormatted.ToArray();
}
我正在尝试将一些数据从用 C# 编写的服务器发送到用 JS 编写的浏览器客户端。当我发送 12900 字节大小的消息时,一切正常。如果我将发送大小为 67990 字节的消息,那么在服务器端我将不会收到任何错误,而在客户端我将收到断开连接错误 1006,没有其他解释。我在某处找不到与消息大小相关的任何限制。这是我尝试发送数据的 C# 代码。
byte[] data =getDecodedMessage(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(dataResponse)));
stream.Write(data, 0, data.Length);
基于question user3892585 answer,我在 WebSocket 数据传输的编码函数中用 bytesRaw.LongLength
替换了 bytesRaw.Length
。这样做后我没有收到套接字错误。
public static byte[] getEncodedMessage(byte[] bytesRaw)
{
List<byte> bytesFormatted = new List<byte>();
bytesFormatted.Add(129);
int indexStartRawData = -1; // it doesn't matter what value is
// set here - it will be set now:
if (bytesRaw.LongLength <= 125)
{
bytesFormatted.Add(Convert.ToByte(bytesRaw.LongLength));
indexStartRawData = 2;
}
else if (bytesRaw.LongLength >= 126 && bytesRaw.LongLength <= 65535)
{
bytesFormatted.Add(126);
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 8) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength) & 255));
indexStartRawData = 4;
}
else
{
bytesFormatted.Add(127);
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 56) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 48) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 40) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 32) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 24) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 16) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength >> 8) & 255));
bytesFormatted.Add(Convert.ToByte((bytesRaw.LongLength) & 255));
indexStartRawData = 10;
}
// put raw data at the correct index
bytesFormatted.InsertRange(indexStartRawData, bytesRaw);
return bytesFormatted.ToArray();
}