发送大于 126 字节的 websockets 消息
Posted
技术标签:
【中文标题】发送大于 126 字节的 websockets 消息【英文标题】:Send larger messages than 126 bytes websockets 【发布时间】:2012-02-20 07:55:18 【问题描述】:现在我正在研究 Websockets,我是新手,我终于可以发送 126 字节的消息,但我需要发送更长的消息,但是当我尝试自动关闭连接时,我的代码是:
public void sendMessage(Stream stream, string message)
try
List<byte> lb = new List<byte>();
string aux = message;
bool flagStart = false;
int size;
while (message.Length > _maxLengthMessage)
lb = new List<byte>();
// I cut the mesasge in smaller pieces to send
message = aux.Substring(0, _maxLengthMessage);
aux = aux.Substring(_maxLengthMessage);
if (!flagStart)
// In doc of Websockets i sign this piece: not the end, text
lb.Add(0x01);
flagStart = !flagStart;
else
// In doc of Websockets i sign this piece: not the end, continuation
lb.Add(0x00);
size = message.Length;
lb.Add((byte)size);
lb.AddRange(Encoding.UTF8.GetBytes(message));
stream.Write(lb.ToArray(), 0, size + 2);
lb = new List<byte>();
if (!flagStart)
// If is this the only message we mark with: end of message, text
lb.Add(0x81);
flagStart = !flagStart;
else
//else Is the end of the message but is the continuation frame
lb.Add(0x80);
size = aux.Length;
lb.Add((byte)size);
lb.AddRange(Encoding.UTF8.GetBytes(aux));
//lb.AddRange(Encoding.UTF8.GetBytes(i.ToString()));
stream.Write(lb.ToArray(), 0, size+2);
catch (Exception ex)
throw ex;
有些答案说“转到 WebSocket 协议”,但它对我不起作用。
【问题讨论】:
嗨 ralp,你能把更正后的代码输入一下吗? 【参考方案1】:您编写消息长度的代码需要扩展。 the protocol spec 的数据框架图中的扩展有效负载显示了缺少的内容。
对于最多 125 个字节的消息,您的代码是正确的。 对于 > 125 但 对于大于 65536 字节的消息,需要写入 9 个字节——第一个字节是 127;以下 8 个字节给出消息长度。
【讨论】:
【参考方案2】:是的,你必须创建正确的框架,方法如下:
static private byte[] CreateFrame(string message, MessageType messageType = MessageType.Text, bool messageContinues = false)
byte b1 = 0;
byte b2 = 0;
switch (messageType)
case MessageType.Continuos:
b1 = 0;
break;
case MessageType.Text:
b1 = 1;
break;
case MessageType.Binary:
b1 = 2;
break;
case MessageType.Close:
b1 = 8;
break;
case MessageType.Ping:
b1 = 9;
break;
case MessageType.Pong:
b1 = 10;
break;
b1 = (byte)(b1 + 128); // set FIN bit to 1
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
if (messageBytes.Length < 126)
b2 = (byte)messageBytes.Length;
else
if (messageBytes.Length < Math.Pow(2,16)-1)
b2 = 126;
else
b2 = 127;
byte[] frame = null;
if(b2 < 126)
frame = new byte[messageBytes.Length + 2];
frame[0] = b1;
frame[1] = b2;
Array.Copy(messageBytes, 0, frame, 2, messageBytes.Length);
if(b2 == 126)
frame = new byte[messageBytes.Length + 4];
frame[0] = b1;
frame[1] = b2;
byte[] lenght = BitConverter.GetBytes(messageBytes.Length);
frame[2] = lenght[1];
frame[3] = lenght[0];
Array.Copy(messageBytes, 0, frame, 4, messageBytes.Length);
if(b2 == 127)
frame = new byte[messageBytes.Length + 10];
frame[0] = b1;
frame[1] = b2;
byte[] lenght = BitConverter.GetBytes((long)messageBytes.Length);
for(int i = 7, j = 2; i >= 0; i--, j++)
frame[j] = lenght[i];
return frame;
【讨论】:
以上是关于发送大于 126 字节的 websockets 消息的主要内容,如果未能解决你的问题,请参考以下文章
是否可以通过 126 个字符发送 websocket 数据?