龙卷风如何使用wsgi的WebSockets

时间:2016-07-04 15:05:18

标签: python python-2.7 tornado wsgi

我正在尝试使用龙卷风制作一个带python的游戏服务器。

问题是WebSockets似乎不适用于wsgi。

wsgi_app = tornado.wsgi.WSGIAdapter(app)
server = wsgiref.simple_server.make_server('', 5000, wsgi_app)
server.serve_forever()

在stackoverflow Running Tornado in apache上查看此答案之后,我已更新了我的代码以使用HTTPServer,它适用于websockets。

server = tornado.httpserver.HTTPServer(app)
server.listen(5000)
tornado.ioloop.IOLoop.instance().start()

但是,当我使用HTTPServer时,会出现错误:TypeError: __call__() takes exactly 2 arguments (3 given)

在互联网上查看,我在这里找到了问题的答案: tornado.wsgi.WSGIApplication issue: __call__ takes exactly 3 arguments (2 given)

但在tornado.wsgi.WSGIContainer周围添加app后,错误仍然存​​在。

我该如何解决这个问题?或者有没有办法使用带有wsgi的龙卷风网络套接字。

此处是我的代码:

import tornado.web
import tornado.websocket
import tornado.wsgi
import tornado.template
import tornado.httpserver
#import wsgiref.simple_server
import wsgiref

print "setting up environment..."

class TornadoApp(tornado.web.Application):
    def __init__(self):

        handlers = [

            (r"/chat", ChatPageHandler),
            (r"/wschat", ChatWSHandler),
            (r"/*", MainHandler)

        ]

        settings = {

            "debug" : True,
            "template_path" : "templates",
            "static_path" : "static"

        }

        tornado.web.Application.__init__(self, handlers, **settings)

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("test.html", food = "pizza")

class ChatPageHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("chat.html")

class ChatWSHandler(tornado.websocket.WebSocketHandler):
    connections = []

    def open(self, *args):
        print 'a'
        self.connections.append(self)
        print 'b'
        self.write_message(u"@server: WebSocket opened!")
        print 'c'

    def on_message(self, message):
        [con.write_message(u""+message) for con in self.connections]

    def on_close(self):
        self.connections.remove(self)

print "done"

if __name__ == "__main__":
    app = TornadoApp()
    server = tornado.httpserver.HTTPServer(tornado.wsgi.WSGIContainer(app))
    server.listen(5000)
    tornado.ioloop.IOLoop.instance().start()

谢谢你的推荐!非常感谢。

1 个答案:

答案 0 :(得分:1)

HTTPServer需要tornado.web.Application,这与WSGI应用程序(可以与WSGIContainer一起使用)不同。

如果你需要WSGI和websockets,你可以在两个独立的进程中运行它们,并在它们之间选择一个IPC机制(并使用真正的WSGI服务器而不是Tornado的WSGIContainer)。如果您需要在同一过程中执行这些操作,则可以使用FallbackHandler

wsgi_container = tornado.wsgi.WSGIContainer(my_wsgi_app)
application = tornado.web.Application([
    (r"/ws", MyWebSocketHandler),
    (r".*", FallbackHandler, dict(fallback=wsgi_container),
])