我正在尝试让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.
我没有想法,也不知道该怎么做。你能帮助我吗? 谢谢!
答案 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":"*"})