了解Autobahn和Twisted集成

时间:2014-05-10 18:03:05

标签: python websocket twisted autobahn

我想了解这里给出的例子: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()

1 个答案:

答案 0 :(得分:1)

" 如何让NotificationProtocolNotificationFactory与websocket交谈并使websocket服务器广播消息":

在SO上查看我的其他答案之一:Persistent connection in twisted。跳转到示例代码并建模您的websocket逻辑,如" IO"逻辑和你有一个很好的契合(你可能也希望看到来自其中一个扭曲的核心团队的newer endpoint calls的后续答案)

" " ws"来自?"

Websockets是通过重新分配http连接来实现的,http连接本质上必须在请求上具有特定路径。那" ws" path通常会映射到一个特殊的http处理程序,高速公路正在为你处理websockets(或者至少是你的javascript所期望的......)。假设设置正确,您实际上可以将您的web-browswer指向该URL,它应该打印出关于websocket握手的错误(Expected WebSocket Headers在我的情况下,但我使用cyclones websockets不是高速公路)。

P.S。来自" websockets的一个很酷的副作用必须有一个特定的路径"是你可以在同一个处理程序/监听/端口上实际混合websockets和普通的http内容,当你试图在同一个SSL端口上运行它们时,这非常方便,因为你试图避免代理前端的要求代码。