最近我开始了一个小型的个人项目。这是一个基于asyncio和autobahn-python的实时网络系统。但是我也希望通过HTTP提供一些静态文件,并从同一个进程执行。我的HTTP服务器是坐在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()
问题:是否有正确的方法让高速公路 - wamp和龙卷风处理程序在同一个端口上监听?
我最初的想法是实现某种类型的socket.socket包装并在那里发送传入的消息,但事实证明它非常混乱。我不想使用任何外部代理,因为后端应尽可能便携
另外,我不是要求任何人为我实施它(当然,如果你愿意的话,你也可以!) - 只知道在潜入高速公路/龙卷风代码之前是否有人做过类似的事情。
提前谢谢!
PS:抱歉我的英语不好 - 这不是我的母语。