Python 重写Autobahn/Twisted WebsocketClientProtocol类

Python 重写Autobahn/Twisted WebsocketClientProtocol类,python,websocket,twisted,autobahn,Python,Websocket,Twisted,Autobahn,我想重写WebSocketClientFactory类,以允许传入数据填充作业队列。这是我正在尝试的连接代码 factory = WebSocketClientFactory("ws://localhost:7096") job_queue = Queue.Queue() factory.protocol = BridgeSocket(job_queue) connectWS(factory) 下面是我的套接字类: class BridgeSocket(WebS

我想重写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之间共享队列。

一种方法是

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中继线?您应该使用带标签的版本或PyPI(0.6.5)的最新版本。*

一个选项是

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中继线?您应该使用带标签的版本或PyPI(0.6.5)的最新版本。*

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

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

谢谢我记得使用了pip安装的默认版本。我做错什么了吗?Pip的默认版本可以。。只是不要使用trunk-它可能正在重构中,无法工作(我想知道您得到的具体错误…
\uuuu call\uuuu
没有实现)。谢谢。我记得使用了pip安装的默认版本。我做错什么了吗?Pip的默认版本可以。。只是不要使用trunk-它可能正在重构中,无法工作(我想知道您得到的具体错误…
\uuuuu call\uuuuuu
没有实现)。是的,这也可以。。这是更普遍的方法。在上面的回答中,我试图给出尽可能短的解决方案。是的,那也行。。这是更普遍的方法。在上面的回答中,我试图给出尽可能短的解决方案。