我正在尝试使用龙卷风制作一个带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()
谢谢你的推荐!非常感谢。
答案 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),
])