【问题标题】:WebSocket Server in Java (hybi 10) sending and receivingJava(hybi 10)中的WebSocket服务器发送和接收
【发布时间】:2011-12-15 23:55:00
【问题描述】:

我正在为草稿的最后一个版本制作 Java 服务器。我设法建立了联系,而且效果很好。

问题是我不明白数据是如何编码的,我一直在尝试找到一些必须如何完成的示例,但我找不到任何东西。所以我想自己做,但需要一些帮助。

Here 是帧的图像。

但我不明白有效载荷从哪里开始。什么是:

扩展的有效载荷长度 (16/63)(如果有效载荷 len==126/127)

这就是我的有效载荷应该在的地方吗?

有人可以提供帮助吗,因为如您所见,我完全迷路了......

【问题讨论】:

    标签: java websocket


    【解决方案1】:

    问题是长度并不总是适合 7 位(您只能用 7 位表示数字 0 到 127),在这种情况下,将使用以下 2 或 8 个字节来使长度适合:

    • 126表示后面2个字节用于长度
    • 127 表示以下 8 个字节用于长度

    因此,如果未编码,有效载荷将从索引 2、4 或 10 开始。编码时,它从 6、8 或 14 开始(因为有 4 个掩码字节)。

    我之前在some pseudocode 上发布过关于解码有效载荷数据的帖子。


    要实际获得长度为“实数”(而不是单独的字节),您可以使用按位移位运算符,如下所示(如果长度有两个字节):

    var length = (bytes[2] << 8) | (bytes[3] << 0);
    

    这将像这样计算它:

    假设:

    • bytes[2]01101001105 以 10 为底)
    • bytes[3]10100101165 以 10 为底)

    然后&lt;&lt; 会做:

    01101001 00000000   // moved 8 places to the left, filled with zeroes
             10100101   // moved 0 places (nothing really happening, you can eliminate '<< 0')
    

    | 基本上是在添加它们:

    01101001 00000000
             10100101
    -----------------  |
    01101001 10100101      (in base 10 that's 27045)
    

    所以如果你有105165这两个字节,那么它们代表27045的长度。

    【讨论】:

    • 很好的链接,另一个问题,我怎么知道要读取多少字节?因为我不知道websocket的“框架”的大小,并且在java中我正在使用“dataInputStream.read(bytes,totalToRead,leftToRead)......任何想法?完全失去......谢谢收获!
    • @Andres:我不懂Java,但正如我所说,框架包括长度。在我发布的三种情况下,您可以使用第二个字节(最后 7 位)、第三和第四个字节或第三到第十个字节来获取长度。
    • @Andres:如果您不知道如何解释字节并将它们转换为长度,请查看我的编辑。
    • @Andres:不,我自己不会这样做。但这并不意味着它被禁止。但是,如果您发送标头数据和附加数据的长度,它应该可以正常工作。
    • @Andres:这取决于; hybi 草案同时支持 UTF-8 数据和二进制数据。使用什么数据取决于操作码(第一个字节的最后 4 位)。如果你发送像ws.send(string)这样的JavaScript,你会得到一个文本帧(UTF-8),操作码是1。如果你像ws.send(arraybuffer)那样发送它,你会得到原始二进制数据,操作码是2。
    猜你喜欢
    • 2011-10-26
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多