![](/img/trans.png)
[英]socket.io connection problem with python server and javascript client
[英]Websocket connection between socket.io client and tornado python server
我正在嘗試使websocket在兩台機器之間工作。 確切地說,一台PC和一台Raspberry Pi。 在PC上,我使用socket.io作為客戶端連接到樹莓派上的服務器。 使用以下代碼,我啟動了連接並嘗試發送預定義的數據。
var socket = io.connect(ip + ':8080');
socket.send('volumes', { data: data });
在樹莓派上,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
並且在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類擴展龍卷風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_allow_origin” =“ *”,一切就可以正常工作= D
if __name__ == '__main__':
EchoRouter = SockJSRouter(EchoConnection, '/echo', user_settings={"websocket_allow_origin":"*"})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.