【问题标题】:How can I send larger messages over WebSocket?如何通过 WebSocket 发送更大的消息?
【发布时间】:2011-11-19 11:33:36
【问题描述】:

我正在使用 C# 开发 WebSocket 服务器,我注意到使用 send() 方法从浏览器(在这种情况下为 Chrome)发出的所有消息的最大长度为 126 个字符。 当我想发送大于 126 个字符的消息时,它总是会发生,看起来协议会剪切任何大于 126 个字符的消息并且只传输前 126 个字符。 我试图检查协议定义,但没有找到任何答案。

那么,我的问题是,我可以通过 WebSockets 发送更大的消息吗?

更新: 这是我在 C# WebSocket 服务器中解析来自客户端 (Chrome) 的消息的方式:

    private void ReceiveCallback(IAsyncResult _result)
    {
        lock (lckRead)
        {
            string message = string.Empty;
            int startIndex = 2;
            Int64 dataLength = (byte)(buffer[1] & 0x7F); // when the message is larger then 126 chars it cuts here and all i get is the first 126 chars
            if (dataLength > 0)
            {
                if (dataLength == 126)
                {
                    BitConverter.ToInt16(buffer, startIndex);
                    startIndex = 4;
                }
                else if (dataLength == 127)
                {
                    BitConverter.ToInt64(buffer, startIndex);
                    startIndex = 10;
                }

                bool masked = Convert.ToBoolean((buffer[1] & 0x80) >> 7);
                int maskKey = 0;
                if (masked)
                {
                    maskKey = BitConverter.ToInt32(buffer, startIndex);
                    startIndex = startIndex + 4;
                }

                byte[] payload = new byte[dataLength];
                Array.Copy(buffer, (int)startIndex, payload, 0, (int)dataLength);
                if (masked)
                {
                    payload = MaskBytes(payload, maskKey);
                    message = Encoding.UTF8.GetString(payload);
                    OnDataReceived(new DataReceivedEventArgs(message.Length, message));
                }

                HandleMessage(message); //'message' -  the message that received

                Listen();
            }
            else
            {
                if (ClientDisconnected != null)
                    ClientDisconnected(this, EventArgs.Empty);
            }
        }
    }

我仍然不明白如何获得更大的消息,它可能与操作码有关,但我不知道要更改什么才能使其正常工作?

【问题讨论】:

    标签: c# .net google-chrome websocket


    【解决方案1】:

    WebSocket 消息可以是任意大小。但是,大消息通常以多个部分(片段)传输,以避免行头阻塞。详情请见WebSockets I-D

    【讨论】:

    • 我在我的问题中写道,我去过那里并没有找到任何答案,请您更具体一点吗?
    • 你能帮我吗?任何可以帮助我接收大尺寸消息的伪代码将不胜感激..
    • 在某些实现中似乎有 2GB 的限制:“所以我们可能想在我们的文档中提到,我们目前支持最多 2 GB 的 Web Socket 消息,包括传入/传出。这是理论上的限制 - -malloc 肯定会在这种大小的移动设备上失败,在这种情况下(根据规范要求)websocket 会失败。” - bugzilla.mozilla.org/show_bug.cgi?id=711003
    • 我不确定相关性,但这篇文章(链接如下)提到了 125 字节的限制,这听起来对 OP 的问题很熟悉。一个正确编写的 websocket 类不应该已经考虑到这一点吗? stackoverflow.com/a/9358640
    【解决方案2】:

    我知道您可以发送超过 126 个字符的消息,
    我能够通过包含本身包含 126 个字符的字符串的 protobuf 发送数据。 http://www.websocket.org/echo.html
    如果您查看此网站,您可以测试您的消息。 (注意这里不使用片段)

    【讨论】:

    【解决方案3】:

    你所说的 DTB 是不正确的。发送绝对应该支持超过 126 个字符。这是正确格式化输出的问题。如果我们限制为 126 个字符,则 WebRTC 将没有信令服务器。我将编写此发送消息功能并在完成后将其发布在此处。

    【讨论】:

    • 这应该是评论,而不是答案。
    猜你喜欢
    • 2023-03-15
    • 2021-07-29
    • 2019-12-23
    • 2023-03-29
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多