最近、私は小さな個人的なプロジェクトを始めました。asyncio と autobahn-python に基づくリアルタイム Web システムです。ただし、HTTP経由でいくつかの静的ファイルを提供し、同じプロセスから実行したいと考えています。私のHTTPサーバーはTornadoがasyncioイベントループの上にあり、別のポートでtornadoとautobahnのハンドラーを開始する必要があることを除いて、すべてが完全に正常に動作します。これは、私が現在持っているものの簡素化されたバージョンです。
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: 英語が下手で申し訳ありません。母国語ではありません。