最近我开始了一个小的个人项目。这是一个基于 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:对不起我的英语不好-这不是我的母语。