【问题标题】:Send larger messages than 126 bytes websockets发送大于 126 字节的 websockets 消息
【发布时间】:2018-08-09 22:54:51
【问题描述】:

现在我正在研究 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,你能把更正后的代码输入一下吗?

标签: c# google-chrome websocket


【解决方案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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多