2013-12-23 36 views
2

我想覆蓋我的WebSocketClientFactory類,以允許傳入數據填充作業隊列。下面是我想覆蓋高速公路/扭曲WebsocketClientProtocol類

factory = WebSocketClientFactory("ws://localhost:7096") 
    job_queue = Queue.Queue() 
    factory.protocol = BridgeSocket(job_queue) 
    connectWS(factory) 

而且這裏的連接代碼是我的插座類:

class BridgeSocket(WebSocketClientProtocol): 
    def __init__(self,producer_queue): 
     self.producer_queue = producer_queue 

    def sendHello(self): 
     self.sendMessage("hello") 

    def onOpen(self): 
     self.sendHello() 
..... 

但是我得到錯誤

exceptions.AttributeError: BridgeSocket instance has no __call__ method 

有沒有什麼辦法,我可以在我的主之間共享隊列線程和我在其中創建的websockets。

回答

3

一種選擇是做

factory = WebSocketClientFactory("ws://localhost:7096") 
factory.job_queue = Queue.Queue() 
factory.protocol = BridgeSocket 

,然後從訪問協議的範圍內共享隊列這樣

class BridgeSocket(WebSocketClientProtocol): 

    def onMessage(self, payload, isBinary): 
     self.factory.job_queue.put(payload) 

*旁註:您是否使用AutobahnPython 幹線從GitHub?您應該使用PyPI(0.6.5)中的標記版本或最新版本。*

+0

謝謝。我記得使用pip install的默認版本。難道我做錯了什麼? – crazydiv

+0

從Pip的默認版本很好..只是不要使用樹幹 - 它可能在重構和不工作(我想知道你得到的具體錯誤......'__call__'沒有實現)。 – oberstet

1

如果有人需要它,我也嘗試了這種方法,但oberstet的解決方案看起來非常優雅高效。

class BridgeSocket(WebSocketClientProtocol): 

    def __init__(self,factory,job_queue): 
     self.job_queue = job_queue 
     self.factory=factory 

class BridgeSocketClientFactory(WebSocketClientFactory): 

    def __init__(self,url,job_queue): 
     WebSocketClientFactory.__init__(self,url) 
     self.job_queue = job_queue 

    def buildProtocol(self, addr): 
     return BridgeSocket(self,self.job_queue) 


factory = BridgeSocketClientFactory("ws://localhost:7096",job_queue) 
connectWS(factory) 
+0

是的,這也是..也是更一般的方法。在上面的答案中,我試圖給出最短的解決方案。 – oberstet