gpt4 book ai didi

python - Tornado 如何将 WebSocket 与 wsgi 一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:42 26 4
gpt4 key购买 nike

我正在尝试使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com