【问题标题】:Tornado Websockets Demo not working on OpenShiftTornado Websockets 演示无法在 OpenShift 上运行
【发布时间】:2015-01-23 02:16:40
【问题描述】:

我正在尝试让 Tornado Websockets Demo 在 OpenShift 上运行。我是从 Python2.7 墨盒开始的。

在 app.py 中,我绑定到 OpenShift 提供的 Python 端口和 Python IP 地址。代码部署没有任何问题,我可以访问我的站点并查看静态文件和索引。在我的客户端中,我确保连接到 OpenShift 标准 websocket 端口 (8000)。

但是,我无法发送或接收数据。每当我尝试发送消息时,我的浏览器控制台中都会出现以下错误:

WebSocket 已经在 CLOSING 或 CLOSED 状态。

我在下面包含了相关的代码部分:

app.py

import ...

ON_PAAS = 'OPENSHIFT_PYTHON_DIR' in os.environ

if ON_PAAS:
    port = int(os.environ['OPENSHIFT_PYTHON_PORT'])
    host = os.environ['OPENSHIFT_PYTHON_IP']
    debug = False
    dir_virtualenv = os.environ['OPENSHIFT_PYTHON_DIR'] + '/virtenv/'
    virtualenv = os.path.join(dir_virtualenv, 'bin/activate_this.py')
        try:
            execfile(virtualenv, dict(__file__=virtualenv))
        except IOError:
            pass
else:
    port = 8000
    host = '127.0.0.1'
    debug = True        

define("port", default=port, help="run on the given port", type=int)
define("host", default=host, help="run on the given host", type=str)
define("debug", default=debug, help="run in debug mode")

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r"/", MainHandler),
            (r"/chatsocket", ChatSocketHandler),
        ]
        settings = dict(
            cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
            template_path=os.path.join(os.path.dirname(__file__), "templates"),
            static_path=os.path.join(os.path.dirname(__file__), "static"),
            xsrf_cookies=True,
        )
        tornado.web.Application.__init__(self, handlers, **settings)

class MainHandler(tornado.web.RequestHandler):
    ...

class ChatSocketHandler(tornado.websocket.WebSocketHandler):
    ...

def main():
    tornado.options.parse_command_line()
    app = Application()
    app.listen(options.port, address=options.host)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

聊天.js

...

var updater = {
    socket: null,

    start: function() {
        var url = "ws://" + location.host + ":8000/chatsocket";
        updater.socket = new WebSocket(url);
        updater.socket.onmessage = function(event) {
            updater.showMessage(JSON.parse(event.data));
        }
    },

    showMessage: function(message) {
        var existing = $("#m" + message.id);
        if (existing.length > 0) return;
        var node = $(message.html);
        node.hide();
        $("#inbox").append(node);
        node.slideDown();
    }
};

编辑:I assume that OpenShift supports WebSockets. 虽然文档不是很详尽。

【问题讨论】:

    标签: javascript python websocket openshift tornado


    【解决方案1】:

    AFAIK,OpenShift 仅允许端口 22 和 443 上的传入 TCP 连接。我认为您无法更改这一点。让您的 WebSocket 服务器也监听 443(而不是 8000)。这是很棒的事情:WebSocket 是对 HTTP 的升级——您的 Web 应用程序和您的 WebSocket 服务器可以在同一个端口上运行。只需要通知您的 Web 服务器,正常的 HTTP 请求将被委托给您的“正常”Web 应用程序,而 HTTP UPGRADE 请求将被委托给您的 WebSocket 服务器。

    编辑:

    我很难找到关于允许与 OpenShift 一起使用的端口的官方文档。从您提到的文章中,您是对的,8000 和 8443 应该可以工作:

    http://app-lovingwebsockets.rhcloud.com/  <= your current HTTP URL
    http://app-lovingwebsockets.rhcloud.com:8000/ <= WebSockets enables HTTP URL
    
    https://app-lovingwebsockets.rhcloud.com/  <= your current HTTPs URL
    https://app-lovingwebsockets.rhcloud.com:8443/ <= WebSockets enables HTTPs URL
    

    但是,这是一篇博文,不是官方文档,而且是从 2012 年开始的。从那时起可能发生了很多变化!您应该继续尝试查找有关在 OpenShift 上使用 WebSockets 的官方文档,真的。

    您是否正确安装了 tornado.websocket.WebSocketHandler 派生实例作为 chatsocket 路由的处理程序?您没有在代码中显示这一点。

    【讨论】:

    • 根据this OpenShift blog post,Openshift 自 2012 年起支持 websocket。
    • 我正确地安装了tornado.websocket.WebSocketHandler 实例作为chatsocket 路由的处理程序。我将编辑上面的代码 sn-p 来显示这一点。尽管我确定我正确执行了所有步骤,但您认为这是非官方文档是正确的。遗憾的是,OpenShift 上的官方 WebSocket 文档似乎不存在。
    【解决方案2】:

    我选择在不使用 Tornado websocket 聊天演示的情况下重新开始。我创建了一个公共 github 存储库,其中包含允许功能性 websockets 的必要代码。

    https://github.com/awwong1/django-tornado-websockets-openshift

    【讨论】:

    • 那么,您确定问题所在了吗?您的问题的标题是“Tornado Websockets Demo not working on OpenShift”——您是否提供了答案? ;)
    【解决方案3】:

    我发现如果客户端和服务器在健全的 open shift 应用程序上运行它可以工作,如果客户端移动到我的 PC 我会遇到相同的行为,连接并突然收到与服务器的断开连接。但是不知道为什么。

    【讨论】:

      猜你喜欢
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多