Twistedで実装されたwebsocketプロトコルがいくつかありますが、 "ws"で接続すると正常に動作しますが、安全なWebソケットを有効にすると__init__
メソッドが2回呼び出されます。具体的には、一度呼び出されるとconnectionLostが呼び出されて接続が失敗し、__init__
が再び呼び出され、今回は接続が開いたままになります。wsで2回初期化されたautobahn websocketのねじれ
以下にコード例を示します。 wssに接続すると、websocketプロトコルの__init__
のログ行が2回呼び出されますが、これはプレーンなWebソケットでは発生しません。これらの日は、エンドポイントを使用することです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()
私は 'var ws = new WebSocket(" wss:// localhost:9000 ");'で新しいwebsocketを作成しています。私はこれを走らせましたが、私は同じ問題を抱えています、それはプロトコルオブジェクトを初期化し、接続を閉じるよりも、それを再び初期化するよりも、この時間は開いたままです。 私は証明書を受け入れることができるようにhttpsエンドポイントを追加していますが、HTTPSエンドポイントを使わずにサーバーを再起動しても、違いがあるかどうかはわかりますが、変更はありません。 また、Firefoxで試してみましたが、このコードでも接続することはできませんでした。 –
これは自己署名入りの証明書ですか?これは似ていますか?このコードを使用して証明書を作成できますか? https://github.com/crossbario/crossbarexamples/tree/master/authentication/tls/static – meejah