在Hybi-10 WebSocket服务器中发送数据的问题
我正在尝试在一个Python服务器中实现新的hybi-10协议,目前我已经成功完成了握手和从客户端(JavaScript)接收数据,但现在在发送数据给客户端时遇到了问题。
我使用了一些来自websockify的代码(encode_hybi
函数)来根据这个协议对数据进行编码。不过不幸的是,客户端似乎没有收到数据,因为消息事件从来没有被触发。
我现在的代码是这样的:
def encode_hybi(self, buf, opcode = 0x01):
buf = b64encode(buf)
b1 = 0x80 | (opcode & 0x0f)
payload_len = len(buf)
if payload_len <= 125:
header = struct.pack('>BB', b1, payload_len)
elif payload_len > 125 and payload_len < 65536:
header = struct.pack('>BBH', b1, 126, payload_len)
elif payload_len >= 65536:
header = struct.pack('>BBQ', b1, 127, payload_len)
print repr(header + buf)
return header + buf
def send(self, data):
logging.info("Message Sent: %s" % data)
if (self.protocol == 'hixie-76'):
self.client.send("\x00%s\xff" % data)
elif (self.protocol =='hybi-10'):
msg = self.encode_hybi(data)
self.client.send(msg)
我通过socket发送了一个简单的'OK'
。在调用encode_hybi
函数后,我得到了:'\x81\x04T0s='
,这个数据被发送到JavaScript。但我没有收到任何响应,也没有错误信息。
我尝试发送其他数据,比如'OKKK'
。在调用encode_hybi
函数后,我得到了:'\x81\x08T0tLSw=='
。不知道这是否有帮助,但发送这个数据后,JavaScript出现了一个错误:
未识别的帧操作码:13。
每当发送的数据长度超过3个字符时,这个错误就会出现。
我真的搞不懂问题出在哪里。编码是不是有什么问题?
1 个回答
4
你在握手格式的结尾用了 \n\r\n\r\n
,但其实应该是 \r\n\r\n
。现在的 \n
被算作了密钥的一部分。
虽然我不太明白你是怎么还能打开连接的,但看起来去掉第一个 \n
就能解决这个问题。