2

最近我开始了一个小的个人项目。这是一个基于 asyncio 和 autobahn-python 的实时网络系统。但是,我也想通过 HTTP 提供一些静态文件,并从同一个过程中完成。我的 HTTP 服务器是 Tornado,它位于 asyncio 事件循环之上,除了我必须在不同的端口上启动 tornado 和高速公路处理程序之外,一切都运行良好。这是我目前拥有的精简版:

import six
import datetime
import asyncio

import tornado.web
import tornado.httpserver
import tornado.netutil
from tornado.platform.asyncio import AsyncIOMainLoop

from autobahn.wamp import router
from autobahn.asyncio import wamp, websocket


# WAMP server
class MyBackendComponent(wamp.ApplicationSession):
    def onConnect(self):
        self.join(u"realm1")

    @asyncio.coroutine
    def onJoin(self, details):
        def utcnow():
            now = datetime.datetime.utcnow()
            return six.u(now.strftime("%Y-%m-%dT%H:%M:%SZ"))

        reg = yield from self.register(utcnow, 'com.timeservice.now')


# HTTP server
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world!")


tornado_app = tornado.web.Application(
    [
        (r"/", MainHandler),
    ],
)


if __name__ == '__main__':
    router_factory = router.RouterFactory()
    session_factory = wamp.RouterSessionFactory(router_factory)
    session_factory.add(MyBackendComponent())
    transport_factory = websocket.WampWebSocketServerFactory(session_factory,
                                                             debug=True,
                                                             debug_wamp=True)

    AsyncIOMainLoop().install()

    tornado_app.listen(80, "127.0.0.1")

    loop = asyncio.get_event_loop()
    coro = loop.create_server(transport_factory, "127.0.0.1", 8080)
    server = loop.run_until_complete(coro)

    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        server.close()
        loop.close()

问题:是否有正确的方法让 autobahn-wamp 和 tornado 处理程序在同一个端口上侦听?
我最初的想法是实现某种 socket.socket 包装器并在那里发送传入的消息,但结果非常混乱。我不想使用任何外部代理,因为后端应该尽可能地便携。
此外,我并没有要求任何人为我实现它(但如果你愿意,当然可以!) - 只是想知道是否有人在深入高速公路/龙卷风代码之前已经做过类似的事情。
提前致谢!
PS:对不起我的英语不好-这不是我的母语。

4

0 回答 0