我正忙着重新发明轮子,玩弄一些实现简单服务器的工具。它几乎可以正常工作,但是我不确定这个问题是我的客户端还是服务器。这是我从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。
祝好运!