我有一个扭曲的Web套接字客户端协议,我在这个反应器循环中有另一个套接字服务器 如何从套接字服务器访问sendMessage方法? 我看到这个link,但我没有得到我应该做的。我试试这个,但是我收到了一些错误:
reactor.callFromThread(WebSocketClientProtocol.sendMessage, protocol, 'data')
exceptions.TypeError: unbound method sendMessage() must be called with WebSocketClientProtocol instance as first argument (got module instance instead)
我的websocket客户端:
class WebSocketProtocol(WebSocketClientProtocol):
def sendHello(self):
self.sendMessage("something")
def onOpen(self):
self.sendHello()
def onMessage(self, msg, binary):
print msg
websocket_factory = WebSocketClientFactory("ws://localhost:1025/ws")
websocket_factory.protocol = WebSocketProtocol
connectWS(websocket_factory)
我用这段代码解决了它:
class WebSocketProtocol(WebSocketClientProtocol):
def onOpen(self):
self.factory.data = []
self.factory.data.append(self)
reactor.callFromThread(WebSocketClientProtocol.sendMessage, websocket_factory.data[0], send)
答案 0 :(得分:4)
callFromThread
仅适用于程序中有多个线程的情况。仅仅因为你有多个服务器并不意味着你有多个线程。事实上,Twisted主要面向运行多个服务器(和/或客户端)而不使用任何额外的线程。
您遇到的具体错误是关于如何在实例上调用实例方法。
WebSocketClientProtocol
是一个类,WebSocketClientProtocol.sendMessage
是一个未绑定的方法。这就像试着写:
class Foo(object):
def bar(self):
print "Foo.bar:", self
Foo.bar()
这不会比你尝试的更好,因为你当然需要一个实例:
foo = Foo()
...
foo.bar()