Понимание интеграции Autobahn и Twisted

Я пытаюсь понять приведенные здесь примеры: https://github.com/tavendo/AutobahnPython/tree/master/examples/twisted/wamp/basic/pubsub/basic

Я создал этот скрипт, который должен обрабатывать несколько подключений к веб-сокетам pub/sub, а также открывать порт tcp (8123) для входящих управляющих сообщений. Когда сообщение приходит на порт 8123, приложение должно транслировать всем подключенным подписчикам сообщение, полученное на порту 8123. Как заставить NotificationProtocol или NotificationFactory общаться с веб-сокетом и заставить сервер веб-сокета транслировать сообщение.

Еще одна вещь, которую я не понимаю, это URL. Клиентский javascript подключается к URL-адресу http://:8080/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()

person Liviu    schedule 10.05.2014    source источник


Ответы (1)


"Как заставить NotificationProtocol или NotificationFactory общаться с веб-сокетом и заставить сервер веб-сокета передавать сообщение":

Посмотрите один из моих других ответов на SO: Постоянное соединение в скрученном. Перейдите к примеру кода и смоделируйте логику своего веб-сокета, например логику «IO», и у вас будет хорошее соответствие (вы также можете увидеть последующий ответ о более новые вызовы конечной точки от одной из запутанных основных команд)

"Откуда взялось "ws"?"

Веб-сокеты реализуются путем переназначения http-соединений, которые по своей природе должны иметь определенный путь в запросе. Этот путь «ws» обычно сопоставляется со специальным обработчиком http, который autobahn создает для вас для обработки веб-сокетов (или, по крайней мере, это то, что ожидает ваш javascript...). Предполагая, что все настроено правильно, вы можете на самом деле указать свой веб-браузер на этот URL-адрес, и он должен вывести ошибку о рукопожатии веб-сокета (Expected WebSocket Headers в моем случае, но я использую циклоны веб-сокеты, а не автобан).

P.S. один из крутых побочных эффектов от «веб-сокетов должен иметь определенный путь» заключается в том, что вы можете смешивать веб-сокеты и обычный http-контент в одном и том же обработчике/прослушивании/порте, это очень удобно, когда вы пытаетесь запустить их все на одном и том же SSL-порт, потому что вы пытаетесь избежать требования прокси-сервера перед вашим кодом.

person Mike Lutz    schedule 12.05.2014