Tornado Websockets Demo无法在OpenShift上运行

时间:2015-01-23 02:16:40

标签: javascript python websocket openshift tornado

我试图让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()

chat.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.但文档并不是非常彻底。

3 个答案:

答案 0 :(得分:1)

AFAIK,OpenShift仅允许端口22和443上的传入TCP连接。我认为你无法改变这一点。让你的WebSocket服务器也在443上监听(而不是8000)。这是件好事:WebSocket是对HTTP的升级 - 您的Web应用程序和您的websocket服务器可以在同一个端口上运行。您的Web服务器只需要被告知,正常的HTTP请求将被委托给您的" normal" 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路由的处理程序?您不会在代码中显示此内容。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我发现,如果客户端和服务器在理智的开放式移动应用程序上运行,那么如果将客户端移动到我的PC,我会遇到相同的行为,连接并突然收到与服务器的断开连接。但不知道为什么。