2011-09-27 46 views
3

我試圖在python服務器中實現新的hybi-10協議,現在我成功地進行了握手並從客戶端接收數據(JavaScript),但現在我在將數據發送給客戶端時遇到問題。我使用websockifyencode_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個字符更大的時間。

我真的不明白這個問題。編碼有問題嗎?

+1

什麼是客戶端?根據錯誤,它看起來像是Chrome。如果是這樣,請看看chrome:// net-internals /。選中右邊的複選框來捕獲字節,然後轉到chrome:// net-internals /#events&q = type:SOCKET%20is:active並查找您的套接字以查看實際接收的字節。那裏有什麼有趣的嗎? – pimvdb

+0

是的,我正在使用chrome。我這樣做,併爲'OK'字符串發送我得到6字節計數[(見這裏)](http://img706.imageshack.us/img706/3654/bytesok.png)。但是,如果我發送更大的字符串,如'OKKKK',則該套接字不會顯示在is:active標記下。 – Neuza

+1

我看到握手響應以'\ n \ r \ n \ r \ n'結尾。你能否嘗試刪除第一個'\ n',因爲它應該以'\ r \ n \ r \ n'結尾。 – pimvdb

回答

3

您在握手格式結束時使用了\n\r\n\r\n,但它應該是\r\n\r\n。目前\n是關鍵的一部分。

雖然我不明白你是如何仍然能夠打開連接,但它看起來像刪除第一個\n解決了這個問題。