【问题标题】:Override Autobahn/Twisted WebsocketClientProtocol class覆盖 Autobahn/Twisted WebsocketClientProtocol 类
【发布时间】:2013-12-23 09:54:42
【问题描述】:

我想重写我的 WebSocketClientFactory 类以允许传入数据填充作业队列。这是我正在尝试的连接代码

    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

有什么方法可以在我的主线程和我在其中创建的 websocket 之间共享队列。

【问题讨论】:

    标签: python websocket twisted autobahn


    【解决方案1】:

    一种选择是做

    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)
    

    *旁注:你使用的是来自 GitHub 的 AutobahnPython trunk 吗?您应该使用标记版本或 PyPI (0.6.5) 的最新版本。*

    【讨论】:

    • 谢谢。我记得使用 pip install 的默认版本。我做错了吗?
    • Pip 的默认版本很好 .. 只是不要使用主干 - 它可能正在重构并且无法正常工作(我想知道你得到的具体错误......__call__ 不是实施)。
    【解决方案2】:

    如果有人需要,我也尝试了这种方法,但 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)
    

    【讨论】:

    • 是的,这也有效.. 并且是更通用的方法。在上面的答案中,我试图给出最短的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多