2

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

4

2 回答 2

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)

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

于 2013-12-23T11:04:24.443 回答
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)
于 2013-12-23T14:48:51.683 回答