簡體   English   中英

socket.io客戶端和龍卷風python服務器之間的Websocket連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM