Tornado 不处理 linux 上的 node-http-proxy websockes

Posted

技术标签:

【中文标题】Tornado 不处理 linux 上的 node-http-proxy websockes【英文标题】:Tornado does not handle node-http-proxy websockes on linux 【发布时间】:2013-04-27 17:24:21 【问题描述】:

如果我启动服务器 python wsserver.py,然后运行 ​​python wsclient.py --host localhost --port 8888,tornado 服务器和客户端的行为将按预期进行。

但是,如果我也启动代理服务器:node node_modules/http-proxy/bin/node-http-proxy --port 8889 --host localhost --target localhost:8888 然后python wsclient.py --host localhost --port 8889 确实连接,但没有消息传递。

这在 Max osx 上运行良好,但在 ubuntu 和 centos 上失败。

wsserver.py:

import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web

class WSHandler(tornado.websocket.WebSocketHandler):
  def open(self):
    print "opened a new websocket"
    listeners.append(self)
    print listeners

  def on_message(self, message):
     self.write_message(u"You Said: " + message)
     print ("in on_message " + message)

  def on_close(self):
    print 'connection closed'
    listeners.remove(self)


def main():
    application = tornado.web.Application([(r'/ws', WSHandler)])
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

wsclient.py:

# must pip install websocket-client first

from argparse import ArgumentParser

def main():
    parser = ArgumentParser()
    parser.add_argument('--port', type=int, required=True)
    parser.add_argument('--host', required=True)

    args = parser.parse_args()
    from websocket import create_connection
    ws = create_connection("ws://%s:%s/ws" %(args.host, args.port))
    print "Sending 'Hello, World'..."
    ws.send("Hello, World")
    print "Sent"
    print "Reeiving..."
    result =  ws.recv()
    print "Received '%s'" % result
    ws.close()

if __name__ == '__main__':
    main()

如何调试?

版本:

节点:0.9.9 http-代理; 0.10.2 蟒蛇:2.7 龙卷风:2.4.1

【问题讨论】:

【参考方案1】:

你能用 node v0.6.x 试试吗? 据我所知,node-http-proxy 与 websockets 有一些头问题,因为从来没有 node 版本(不确定它从哪个版本开始)。我确定使用较低的节点版本你应该没问题。

【讨论】:

Node v0.6.12 适用于 ubuntu 和 centos。但是,当代理在 Mac osx 上运行时,所有版本的节点都可以工作

以上是关于Tornado 不处理 linux 上的 node-http-proxy websockes的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 检测到某些东西已插入 linux 上的音频插孔?

Tornado的异步非阻塞

1.tornado基础

Python Web 框架:Tornado

Tornado websocket 处理程序,self.close() 正在关闭连接而不触发 on_close() 方法

Python Tornado之四(Http层)