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

socket.io客户端和tornado python服务器之间的Websocket连接,python,sockets,socket.io,tornado,Python,Sockets,Socket.io,Tornado,我想让WebSocket在两台机器之间工作。确切地说,一台pc和一台覆盆子皮。 在PC上,我使用socket.io作为客户端连接到raspberry pi上的服务器。 使用以下代码,我初始化了连接并尝试发送预定义的数据 var socket = io.connect(ip + ':8080'); socket.send('volumes', { data: data }); 在raspberry pi上,websocket服务器如下所示: from tornado import web, io

我想让WebSocket在两台机器之间工作。确切地说,一台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.01毫秒

在pc上的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. 
我没有主意了,不知道该怎么办。你能帮助我吗?
谢谢大家!

好吧,解决问题的方法与sockjs tornado库的内部设计有关,而不是与socket.io库有关

基本上,您的问题与跨源请求有关,即生成对websocket服务器的请求的html与websocket服务器不在同一个源。我可以从你的代码中看出,你已经发现了这个问题(并且你试图通过重新定义“check_origin”方法来解决它),但是你没有找到正确的方法来解决这个问题,基本上是因为在这个库中不是SockJSConnection类,它扩展了tornado WebSocketHandler,因此重新定义它的“check_origin”是无用的。如果您仔细研究一下代码,就会发现存在一个已定义的类,即SockJSWebSocketHandler,它对此类方法本身进行了重新定义,如果返回true,则依赖于tornado实现,但这也允许您使用设置参数避免该检查:

class SockJSWebSocketHandler(websocket.WebSocketHandler):
    def check_origin(self, origin):
        ***
        allow_origin = self.server.settings.get("websocket_allow_origin", "*")
            if allow_origin == "*":
                return True
因此,总而言之,您只需要在服务器设置中包含设置“websocket\u allow\u origin”=“*”,一切都应该正常工作=D

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

我刚试过你的建议,但我一直收到与上面相同的404信息。我的机器上也有一个nginx网络服务器。龙卷风会干扰吗?它不应该。。。这可能与请求中使用的协议有关吗?“ip”变量的值是多少?是的!非常感谢。我让它工作了。我刚刚为客户端从socket.io切换到sockjs,刚刚收到了我的第一条短信。如果有人有同样的问题,我是否应该发布代码herre?是的,你应该发布,以备将来参考=D@kirijanker你应该发布工作代码,这会很有帮助。