2013-01-22 41 views
8

我想通過websocket連接(我使用python websocket客戶端)發送會話id(我通過http服務器進行身份驗證後得到它),我需要將它作爲一個標頭參數,其中服務器(Tornado Websocket服務器)將讀取所有標題並檢查它們。如何在websocket中添加更多頭文件python client

問題是:我如何添加標題來使用現有的客戶端python Websocket實現之一,我發現他們中的任何一個都無法做到這一點,或者我是否首先採用錯誤的方法進行身份驗證?

- 更新 -,下面的代碼模板,我使用:

def on_message(ws, message): 
    print 'message received ..' 
    print message 


def on_error(ws, error): 
    print 'error happened .. ' 
    print error 


def on_close(ws): 
    print "### closed ###" 


def on_open(ws): 

    print 'Opening Websocket connection to the server ... ' 

    ## This session_key I got, need to be passed over websocket header isntad of ws.send. 
    ws.send(session_key) 

if __name__ == "__main__": 
    websocket.enableTrace(True) 
    ws = websocket.WebSocketApp("ws://localhost:9999/track", 
           on_open = on_open, 
           on_message = on_message, 
           on_error = on_error, 
           on_close = on_close, 
           ) 
    ws.on_open = on_open 

    ws.run_forever() 
+0

你能爲你的問題添加一些代碼嗎?如果您可以添加SSCCE http://sscce.org/ –

+0

請檢查我的更新。 – securecurve

回答

4

似乎websocket客戶端已被更新爲包含websocket標題,因爲這個問題被問到。現在,你可以簡單地傳遞作爲字符串的頭參數列表:

custom_protocol = "your_protocol_here" 
protocol_str = "Sec-WebSocket-Protocol: " + custom_protocol 
ws = websocket.WebSocketApp("ws://localhost:9999/track", 
          on_open = on_open, 
          on_message = on_message, 
          on_error = on_error, 
          on_close = on_close, 
          header = [protocol_str] 
          ) 

如果你有興趣在有效標頭的完整列表,請參閱WebSocket的RFC6455文檔:http://tools.ietf.org/html/rfc6455#section-4.3

的GitHub來源:https://github.com/liris/websocket-client/blob/master/websocket.py

+0

這一個沒有工作,這就是爲什麼我添加了源代碼修改..除非你自己測試它,它爲你工作 – securecurve

+0

是的,我已經成功地測試它。自從你在1月份的答案中看到了源代碼的變化,從那時起他們已經修復了不存在的頭文件參數,所以我想我會在這裏給未來的觀衆留下一個替代答案。看源代碼行773:https://github.com/liris/websocket-client/blob/master/websocket.py#L773 – IanTheEngineer

+0

是的,你是對的.. +1更新:) – securecurve

7

沒有什麼比閱讀源代碼:))更有趣

我猴子打補丁的源代碼WebSocket的客戶端庫,使之能夠接收頭在初始化一個正常的參數,如:

ws = websocket.WebSocketApp("ws://localhost:9999/track", 
           on_open = on_open, 
           on_message = on_message, 
           on_error = on_error, 
           on_close = on_close, 
           header  = {'head1:value1','head2:value2'} 
           ) 

這可以做NE通過在庫的websocket.py源代碼編輯3行:

1-添加報頭參數:

## Line 877 
    class WebSocketApp(object): 
     """ 
     Higher level of APIs are provided. 
     The interface is like JavaScript WebSocket object. 
     """ 
     def __init__(self, url, 
        on_open = None, on_message = None, on_error = None, 
        on_close = None, keep_running = True, get_mask_key = None, header = None): 

self.url = url 
     self.on_open = on_open 
     self.on_message = on_message 
     self.on_error = on_error 
     self.on_close = on_close 
     self.keep_running = keep_running 
     self.get_mask_key = get_mask_key 
     self.sock = None 
     self.header = header 

2-然後,通過self.header到網頁套接字連接方法作爲報頭參數,像這樣:

## Line 732 
self.sock.connect(self.url, header = self.header) 

其實我試圖導入WebSocketApp類,但它沒有工作,因爲整個websocket.py模塊是相互依存的,我發現自己是進口很多東西,使其工作在這種情況下,猴子修補更容易,更穩固。

就是這樣,享受使用您所需的所有標題的修補庫。

+0

我和你一樣爲類似的話題而奮鬥。我可以問你如何處理這種情況:當你通過會話ID(從http服務器)到websocket服務器,我想你檢查服務器端是這個會話ID有效。你如何存儲這個會話ID?在數據庫中?我假設http服務器和websocket服務器需要使用同一個id會話池是對的嗎? – maciekm

+0

WebSocketApp構造器的頭參數的默認值令人困惑;頭= []。事實上,它不應該是一個列表,而是一本字典。 –

相關問題