在C#中发送大于126字节的websockets更大的消息

现在我正在使用Websockets,我是新的,我最终可以发送一个126字节的消息,但我需要发送更长的消息但是当我尝试连接自动关闭时,我的代码是:

public void sendMessage(Stream stream, string message) { try { List lb = new List(); string aux = message; bool flagStart = false; int size; while (message.Length > _maxLengthMessage) { lb = new List(); // 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(); 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协议”我做到了什么都没有,也许我不是很了解,所以我需要你的帮助。

谢谢。

您需要扩展编写消息长度的代码。 协议规范的数据成帧图中的扩展有效负载显示了缺失的内容。

对于最多125字节的消息,您的代码是正确的。
对于> 125但<= 65536字节的消息,您需要写入3个字节 - 第一个字节为126; 以下2个字节给出了消息长度。
对于> 65536字节的消息,您需要写入9个字节 – 第一个字节为127; 以下8个字节给出了消息长度。

你必须创建正确的框架,这里是方法:

 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; }