socket.io客户端和tornado python服务器之间的Websocket连接

时间:2014-10-09 15:00:04

标签: python sockets socket.io tornado

我正在尝试让websockets在两台机器之间工作。确切地说,一台PC和一台树莓派。 在PC上,我使用socket.io作为客户端连接到raspberry pi上的服务器。 使用以下代码,我终止了连接并尝试发送预定义数据。

var socket = io.connect(ip + ':8080');
socket.send('volumes', { data: data });

在raspberry pi上,websocket服务器看起来像这样:

from tornado import web, ioloop
from sockjs.tornado import SockJSRouter, SockJSConnection

class EchoConnection(SockJSConnection):

    def on_message(self, msg):
        self.send(msg)


    def check_origin(self, origin):
        return True

if __name__ == '__main__':
    EchoRouter = SockJSRouter(EchoConnection, '/echo')

    app = web.Application(EchoRouter.urls)
    app.listen(8080)
    ioloop.IOLoop.instance().start()

但是这种联系从未建立过。我不知道为什么。在服务器日志中,我得到:

  

警告:tornado.access:404 GET /socket.io/1/?t=1412865634790   (192.168.0.16)9.01ms

在电脑上的Inspector中有以下错误信息:

XMLHttpRequest cannot load http://192.168.0.10:8080/socket.io/1/?t=1412865634790. Origin sp://793b6d4588ead99e1780e35b71d24d1b285328f8.hue is not allowed by Access-Control-Allow-Origin. 

我没有想法,也不知道该怎么做。你能帮助我吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

嗯,问题的解决方案与sockjs-tornado库的内部设计有关,而不是socket.io库。

基本上,您的问题与交叉源请求有关,即生成对websocket服务器的请求的html与websocket服务器的起源不同。我可以从你的代码中看到你已经发现了问题(并且你试图通过重新定义方法“check_origin”来解决它)但是你没有找到正确的方法来完成它,主要是因为在这个库中不是SockJSConnection类扩展龙卷风WebSocketHandler并重新定义其“check_origin”的那个是无用的。如果你在代码中稍微深入一点,你会发现存在一个定义的类,即SockJSWebSocketHandler,它重新定义了这样的方法本身,如果它返回true,它依赖于龙卷风实现,但这也允许你避免使用设置参数检查:

class SockJSWebSocketHandler(websocket.WebSocketHandler):
    def check_origin(self, origin):
        ***
        allow_origin = self.server.settings.get("websocket_allow_origin", "*")
            if allow_origin == "*":
                return True

因此,总而言之,您只需要在服务器设置中包含“websocket_allow_origin”=“*”设置,一切都应该正常工作= D

if __name__ == '__main__':
    EchoRouter = SockJSRouter(EchoConnection, '/echo', user_settings={"websocket_allow_origin":"*"})