【发布时间】:2016-08-24 15:54:47
【问题描述】:
我有一些使用 Twisted 实现的 websocket 协议,当我使用“ws”连接时它们工作正常,但是当我启用安全 websockets 时,__init__ 方法被调用了两次。更具体地说,它被调用一次,然后连接显然失败,调用 connectionLost,然后再次调用__init__,这次连接保持打开状态。
下面的代码就是一个例子。当我使用 wss 连接时,websocket 协议的__init__ 中的日志行被调用了两次,但普通 websocket 不会发生这种情况。
导入套接字 从日期时间导入日期时间 from twisted.internet 导入反应堆
from twisted.internet.ssl import DefaultOpenSSLContextFactory
from autobahn.twisted.websocket import WebSocketServerProtocol, WebSocketServerFactory, listenWS
import txaio
txaio.use_twisted()
CERT_KEY = "certificate.key"
CERT_PATH = "certificate.crt"
def log(msg):
print("{}: {}".format(str(datetime.now()), msg))
class TestProtocol(WebSocketServerProtocol):
def __init__(self):
super(TestProtocol, self).__init__()
log("Test protocol init")
def connectionLost(self, reason):
WebSocketServerProtocol.connectionLost(self, reason)
log("Connection closed: Reason is {}".format(reason))
class TestProtocolFactory(WebSocketServerFactory):
protocol = TestProtocol
def init_websocket_protocol(factory_cls, port):
try:
key, crt = CERT_KEY, CERT_PATH
context_factory = DefaultOpenSSLContextFactory(key, crt)
connection_string = "wss://localhost:{}".format(str(port))
factory = factory_cls(connection_string)
listenWS(factory, contextFactory=context_factory)
log("Port {} bound to test websocket server".format(str(port)))
except socket.error as e:
log("Server was unable to bind to a new port: ".format(str(e)))
def main():
init_websocket_protocol(TestProtocolFactory, 9000)
reactor.run()
if __name__ == '__main__':
main()
【问题讨论】:
标签: python websocket twisted autobahn