【问题标题】:Websocket base64, binarytypeWebsocket base64,二进制类型
【发布时间】:2015-07-03 20:31:58
【问题描述】:

我很困惑。我试图了解 Websockets 是如何工作的,并在 node.js 和客户端中构建了一个服务器。 我无法理解的是,Websocket 如何发送数据。 在从客户端(浏览器)发送之前是否对数据库进行了 base64 编码? “二进制类型”如何工作?只为接收?

我也必须在服务器上实现这些吗? 我需要在服务器端使用“二进制类型”选项吗?

什么时候需要 blob 和 arraybuffer ?依赖小数据和大数据? 获取视频和音频文件怎么办?

我查看了应该如何在网络上发送图片,我发现 解决方案通常是图片经过base64编码并在此之后发送。 但是如果浏览器中的 Websocket API 已经将二进制文件编码为 base64,我就不必这样做了..

对不起,我很困惑,希望有人能帮助我

【问题讨论】:

    标签: javascript node.js networking websocket network-programming


    【解决方案1】:

    阅读RFC 6455,尤其是5. Data Framing,您可以在那里找到答案。

    在 WebSocket 协议中,数据使用 帧 序列(而不是 base64 编码)传输。 RFC 6455中定义的帧类型如下。

    1. 继续帧(操作码 = 0x0)
    2. 文本帧(操作码 = 0x1)
    3. 二进制帧(操作码 = 0x2)
    4. 关闭帧(操作码 = 0x8)
    5. Ping 帧(操作码 = 0x9)
    6. 乒乓帧(操作码 = 0xA)

    体面的 WebSocket 库(客户端和服务器端的)可以处理所有这些帧并提供发送/接收它们的函数/方法。因此,无论数据是文本还是二进制数据,您都不必担心数据是如何编码的(除非您选择了错误的 WebSocket 库)。

    请注意,客户端和服务器都可以发送/接收文本帧和二进制帧。

    【讨论】:

    • 感谢您的回答。但我正在编写自己的库,并想了解它是如何工作的。我知道发送了帧,但是如何将数据放入该帧?编码中会发生什么?
    • 看WebSocketOutputStream.write(WebSocketFrame)在nv-websocket-client中的实现,就能明白数据是如何打包成帧的。请注意,当帧从客户端发送到服务器时,有效负载部分必须被屏蔽,并且不得反方向。有关详细信息,请参阅 RFC 6455 5.3. Client-to-Server Masking。
    • 我现在明白了数据是如何发送的。但这不是我想要的。你能解释一下'binarytype'选项是什么吗?当客户端浏览器 api 设置为“blob”并且传入消息包含数组缓冲区时,它是否会更改传入消息的实体?还是只是一个愿望,它(传入的消息)是如何首选的?服务器怎么知道,在浏览器的客户端设置了什么'binarytype'选项?
    • binaryType 是一个属性,用于指示在处理二进制消息时要使用哪个 JavaScript 类(Blob 或 ArrayBuffer)。例如,如果binaryType 是arraybuffer,则接收到的二进制消息将转换为ArrayBuffer 对象,您将在onmessage() 回调中看到它。见MDN WebSocket。不管binaryType 的值是多少,二进制帧都是作为二进制帧发送的。
    • 我查看了wireshark,现在可以说,二进制消息是来自已发送二进制文件的十六进制转储,数组缓冲缓冲区内容的十六进制视图。我明白,二进制类型只是客户端浏览器选项,而不是为服务器端提供,对吗?我没有测试的是,如果二进制类型设置为 blob 并且服务器发送一个数组缓冲区,反之亦然。
    【解决方案2】:

    Websockets 可以传输文本和二进制数据。 WebSocket 二进制数据有两种形式:blob 和数组缓冲区。

    ws.binaryType = "blob";
    // or
    ws.binaryType = "arraybuffer";
    

    因此您不需要将二进制转换为文本和将文本转换为二进制来进行传输。可以直接使用二进制。

    您可能提到的问题(例如二进制到 base64)是由于长期以来浏览器不能很好地处理与 JavaScript 结合使用的二进制,因此您需要将文本打乱,以绕过限制.这在现代浏览器中有所改进(虽然我不知道每个主要浏览器的确切支持)。

    查看此内容了解更多详情:Processing Binary Protocols with Client-Side JavaScript

    关于服务器端,是的,您还需要处理二进制数据。如果客户端需要二进制,则服务器应该发送二进制。现在,我对 Node.js 还不是很熟悉,但是快速搜索一下就会发现这个看起来很有希望的包:http://binaryjs.com/

    【讨论】:

    • 感谢您的回答。我是否必须为服务器实现“二进制类型”选项?据我了解,'binarytype' 选项仅用于客户端作为反馈,以处理传入的消息。以及如何在服务器端检查客户端需要哪种“二进制类型”?
    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多