我试图让Tornado Websockets Demo在OpenShift上运行。我是从Python2.7盒式磁带开始的。
在app.py中,我绑定到OpenShift提供的python端口和python IP地址。代码部署没有任何问题,我可以访问我的网站并查看静态文件和索引。在我的客户端中,我确保连接到OpenShift标准websocket端口(8000)。
但是,我无法发送或接收数据。每当我尝试发送消息时,我的浏览器控制台中都会出现以下错误:
WebSocket已经处于CLOSING或CLOSED状态 状态。
我已经在下面列出了相关的代码部分:
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()
...
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.但文档并不是非常彻底。
答案 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,我会遇到相同的行为,连接并突然收到与服务器的断开连接。但不知道为什么。