[英]Understanding Autobahn and Twisted integration
我正在嘗試理解此處給出的示例: https : //github.com/tavendo/AutobahnPython/tree/master/examples/twisted/wamp/basic/pubsub/basic
我構建了該腳本,該腳本應該處理多個pub / sub websocket連接,並且還為傳入的控制消息打開了一個tcp端口(8123)。 當消息在8123端口上出現時,應用程序應向所有連接的訂戶廣播在端口8123上接收到的消息。如何使NotificationProtocol或NotificationFactory與Websocket對話並使Websocket服務器廣播消息。
我不明白的另一件事是網址。 客戶端javascript連接到URL http://:8080 / ws。 “ ws”來自哪里?
也有人可以解釋一下RouterFactory,RouterSessionFactory的用途以及以下內容:
from autobahn.wamp import types
session_factory.add( WsNotificationComponent(types.ComponentConfig(realm = "realm1" )))
我的代碼如下:
import sys, time
from twisted.internet import reactor
from twisted.internet.protocol import Protocol, Factory
from twisted.internet.defer import inlineCallbacks
from autobahn.twisted.wamp import ApplicationSession
from autobahn.twisted.util import sleep
class NotificationProtocol(Protocol):
def __init__(self, factory):
self.factory = factory
def dataReceived(self, data):
print "received new data"
class NotificationFactory(Factory):
protocol = NotificationProtocol
class WsNotificationComponent(ApplicationSession):
@inlineCallbacks
def onJoin(self, details):
counter = 0
while True:
self.publish("com.myapp.topic1", "test %d" % counter )
counter += 1
yield sleep(1)
## we use an Autobahn utility to install the "best" available Twisted reactor
##
from autobahn.twisted.choosereactor import install_reactor
reactor = install_reactor()
## create a WAMP router factory
##
from autobahn.wamp.router import RouterFactory
router_factory = RouterFactory()
## create a WAMP router session factory
##
from autobahn.twisted.wamp import RouterSessionFactory
session_factory = RouterSessionFactory(router_factory)
from autobahn.wamp import types
session_factory.add( WsNotificationComponent(types.ComponentConfig(realm = "realm1" )))
from autobahn.twisted.websocket import WampWebSocketServerFactory
transport_factory = WampWebSocketServerFactory(session_factory)
transport_factory.setProtocolOptions(failByDrop = False)
from twisted.internet.endpoints import serverFromString
## start the server from an endpoint
##
server = serverFromString(reactor, "tcp:8080")
server.listen(transport_factory)
notificationFactory = NotificationFactory()
reactor.listenTCP(8123, notificationFactory)
reactor.run()
“ 如何使NotificationProtocol
或NotificationFactory
與websocket對話並使Websocket服務器廣播消息 ”:
在SO上查看我的其他答案之一: Twisted中的持久連接 。 跳至示例代碼,並對Websocket邏輯(如“ IO”邏輯)進行建模,就很合適(您可能還想查看有關來自扭曲核心團隊之一的較新終結點調用的后續答案。太)
“ ws”來自哪里? ”
Websocket通過重新分配http連接的任務來實現,http連接本質上必須在請求上具有特定的路徑。 該“ ws”路徑通常會映射到autobahn為您構建的特殊http處理程序,以處理websocket(或者至少是您的javascript期望的……)。 假設設置正確,您實際上可以將Web瀏覽器指向該URL,它應該會打印回有關websocket握手的錯誤(在我的情況下是Expected WebSocket Headers
,但我使用的是氣旋 websockets而不是高速公路)。
PS:“ websockets必須具有特定路徑”的一個很酷的副作用是,您實際上可以在同一處理程序/偵聽/端口上混合使用websockets和正常的http內容,當您嘗試在所有這些上運行它們時,這真的很方便相同的SSL端口,因為您試圖避免要求在代碼前端添加代理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.