我試圖在python服務器中實現新的hybi-10協議,現在我成功地進行了握手並從客戶端接收數據(JavaScript),但現在我在將數據發送給客戶端時遇到問題。我使用websockify(encode_hybi
函數)中的一段代碼根據此協議對幀進行編碼。但不幸的是,客戶端似乎沒有收到數據,因爲on消息事件從未激發。在hybi-10 WebSockets服務器中發送數據的問題
所以我的代碼是這樣的:
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)
我通過套接字發送一個簡單的'OK'
。因此,在得到encode_hybi函數之後: '\x81\x04T0s='
發送到JavaScript。我沒有迴應,也沒有錯誤。
我試圖發送其他數據,例如'OKKK'
。在得到encode_hybi函數後:'\x81\x08T0tLSw=='
。不知道是否有幫助,但這個數據發送時,JavaScript提供了一個錯誤:
Unrecognized frame opcode: 13.
這個錯誤會在每次發送的數據的長度小於3個字符更大的時間。
我真的不明白這個問題。編碼有問題嗎?
什麼是客戶端?根據錯誤,它看起來像是Chrome。如果是這樣,請看看chrome:// net-internals /。選中右邊的複選框來捕獲字節,然後轉到chrome:// net-internals /#events&q = type:SOCKET%20is:active並查找您的套接字以查看實際接收的字節。那裏有什麼有趣的嗎? – pimvdb
是的,我正在使用chrome。我這樣做,併爲'OK'字符串發送我得到6字節計數[(見這裏)](http://img706.imageshack.us/img706/3654/bytesok.png)。但是,如果我發送更大的字符串,如'OKKKK',則該套接字不會顯示在is:active標記下。 – Neuza
我看到握手響應以'\ n \ r \ n \ r \ n'結尾。你能否嘗試刪除第一個'\ n',因爲它應該以'\ r \ n \ r \ n'結尾。 – pimvdb