我正忙着重新发明轮子,玩弄一些实现简单服务器的工具。它几乎可以正常工作,但是我不确定这个问题是我的客户端还是服务器。这是我从net.Conn传递结果字节数组的函数

func readWsFrame(p []byte) {
    // process first byte
    b := p[0]
    fmt.Printf("first byte: %b\n", b)
    fin := b & 128 // hopefully 128, for fin
    op := b & 15   // hopefully 1, for text
    fmt.Printf("fin: %d\nop: %d\n", fin, op)
    // process second byte
    b = p[1]
    fmt.Printf("second byte: %b\n", b)
    masked := b & 128 // whether or not the payload is masked
    length := b & 127 // payload length
    fmt.Printf("masked: %d\nlength: %d\n", masked, length)
    // process bytes 3-7 (masking key)
    key := p[2:6]
    // payload
    d := p[6:]
    if length == 126 {
        key = p[4:8]
        d = p[8:]
        fmt.Println("med key")
    } else if length == 127 {
        key = p[10:14]
        d = p[14:]
        fmt.Println("big key")
    } else {
        fmt.Println("lil key")
    }
    fmt.Printf("masking key: %b\n", key)
    fmt.Printf("masked data: %b\n", d)
    var decoded []byte
    for index := 0; index < int(length); index++ {
        decoded = append(decoded, d[index]^key[index%4])
    }
    fmt.Printf("unmasked data: %b\n", decoded)
    payload := string(decoded)
    fmt.Println("payload: ", payload)
}

客户端代码是我在此网页上打开开发控制台并正在运行
var ws = new WebSocket("ws://localhost:16163");
ws.send("a".repeat(125))
ws.send("a".repeat(126))
ws.send("a".repeat(127))
ws.send("a".repeat(400))

在达到127个字符之前,服务器将按预期运行。那时,每超过126,我的第二个字节就是11111110,长度是126。我可以看到未屏蔽/编码/魔术消息没有超过126 a。

我确定我的go代码是低于标准的,这里可能有一些明显的问题,但是我正在查看这些数据本身,我可以看到0,我期望的是1,请帮助我,谢谢!

我遇到了一个类似的问题,即编写大于126字节的消息,以及如何需要额外的字节来增加有效负载大小,但是在这种情况下,我的客户端是chrome网络浏览器。

- 编辑:

我意识到基于那里的循环,我永远不会看到超过126个字符,但是对于这些较大的消息,我仍然应该在第二个字节的最后一位看到1,对吗?

- 编辑:

碰到了这个how to work out payload size from html5 websocket

我想我误会了我正在寻找的所有其他东西。有人可以确认吗?如果长度
我最初以为,如果有效载荷长度为127+ hah,那么长度将为127,哎呀。那么,当长度为126或127时,第二个字节不是实际长度的一部分吗?我可能会通过测试来确认所有这些内容,但是我感谢大家在周末之前解决了这个问题,以便我可以完成这个副项目。

最佳答案

通过读取初始长度指示符后面的字节中的长度数据,代码应在实现127或126后更新length属性。

我认为这7个“长度”位略有不同。实际上,它们指示的长度不如指示编码的长度。

如果使用64位(8个字节)对长度进行编码,则长度指示符== 127。

如果长度以2个字节编码,则指示符== 126。

否则,长度将以指示器本身的7位编码。

例如,长度60可以用所有三种方式编码(尽管有些方式使用更多的空间)。

如果您想阅读长度解码的示例,则有一个C Websocket implementation here

祝好运!

08-15 23:16