简体   繁体   English

发送大于 126 字节 websockets 的消息

[英]Send larger messages than 126 bytes websockets

Now I'm working on Websockets, I'm new in that, I finally can send a message of 126 bytes, but I need send longer messages but when I try the connection is closed automatically, my code is:现在我正在研究 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;
        }

    }

Some answers say "Go to the The WebSocket protocol", but it didn't work for me.有些答案说“转到 WebSocket 协议”,但它对我不起作用。

Your code to write the message length needs to be extended.您编写消息长度的代码需要扩展。 The extended payload in the data framing diagram of the protocol spec shows what's missing. 协议规范的数据帧图中扩展有效载荷显示了缺失的内容。

For messages up to 125 bytes, your code is correct.对于最多 125 个字节的消息,您的代码是正确的。
For messages > 125 but <= 65536 bytes, you need to write 3 bytes - the first byte is 126;对于> 125但<= 65536字节的消息,你需要写3个字节——第一个字节是126; the following 2 bytes give the message length.以下 2 个字节给出了消息长度。
For messages > 65536 bytes, you need to write 9 bytes - the first byte is 127;对于大于 65536 字节的消息,需要写入 9 个字节——第一个字节为 127; the following 8 bytes give the message length.以下 8 个字节给出了消息长度。

Ye, you have to create correct frame, here is the method:是的,您必须创建正确的框架,这是方法:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM