- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 python、tornado 制作一个游戏服务器。
问题是 WebSocket 似乎无法与 wsgi 一起使用。
wsgi_app = tornado.wsgi.WSGIAdapter(app)
server = wsgiref.simple_server.make_server('', 5000, wsgi_app)
server.serve_forever()
在 stackoverflow 上查看这个答案后,Running Tornado in apache ,我已更新代码以使用可与 websockets 配合使用的 HTTPServer
。
server = tornado.httpserver.HTTPServer(app)
server.listen(5000)
tornado.ioloop.IOLoop.instance().start()
但是,当我使用 HTTPServer 时,会出现错误:TypeError: __call__() 恰好需要 2 个参数(给定 3 个参数)
在网上查了一下,我在这里找到了这个问题的答案: tornado.wsgi.WSGIApplication issue: __call__ takes exactly 3 arguments (2 given)
但是在 app
周围添加 tornado.wsgi.WSGIContainer
后,错误仍然存在。
如何解决这个问题?或者有什么方法可以将tornado web sockets与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()
提前致谢!非常感谢您的帮助。
最佳答案
HTTPServer
需要 tornado.web.Application
,它与 WSGI 应用程序不同(您可以将其与 WSGIContainer
一起使用)。
如果您同时需要 WSGI 和 websocket,建议您在两个单独的进程中运行它们,并在它们之间选择 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),
])
关于python - Tornado 如何将 WebSocket 与 wsgi 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38187728/
我是一名优秀的程序员,十分优秀!