簡體   English   中英

如何使 Socket.IO 客戶端連接到 Python3 Websocket 服務器

[英]How to make a Socket.IO client connect to a Python3 Websocket server

我正在嘗試讓 Socket.IO 客戶端連接到我使用aaugustin 的 websockets 庫和 asyncio 創建的 Python Websocket 服務器。 使用頁面上的示例,我創建了以下 Web 套接字服務器:

import asyncio
import websockets
from datetime import datetime

@asyncio.coroutine
def producer():
   return str(datetime.now())

@asyncio.coroutine
def handler(websocket, path):
    while True:
        message = yield from producer()
        if not websocket.open:
            break
        yield from websocket.send(message)
        yield from asyncio.sleep(3)

start_server = websockets.serve(handler, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

該視圖使用 Flask 提供,如下所示:

<!doctype html>
<head>
    <title>Websocket Client Test</title>
</head>
<body>
    <script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
    <script>
        console.log(io);
        var socket = io("ws://localhost:8765/");
        console.log(socket);
    </script>
</body>

每當 Socket.IO 嘗試連接時,它都會拋出以下錯誤:

XMLHttpRequest cannot load http://localhost:8765/socket.io/?EIO=3&transport=polling&t=1434254272412-0. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:5001' is therefore not allowed access. The response had HTTP status code 400.

Access-Control-Allow-Origin 似乎暗示我正在嘗試向具有不同主機名的位置發出請求,但我沒有這樣做。 所以我不知道為什么它會拋出那個錯誤。 我創建了一個可以很好地連接到服務器的 Python 客戶端腳本,所以我對我缺少的東西有點迷茫。

Access-Control-Allow-Origin 似乎暗示我正在嘗試向具有不同主機名的位置發出請求,但我沒有這樣做。

對於許多實現,不同的端口被認為是不同的來源。 來自https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy

如果兩個頁面的協議、端口(如果指定了一個)和主機相同,則兩個頁面具有相同的來源

我相信這是不可能的。 Socket.io 實現了自己的協議,因此您不能將 socket.io-client 與非 socket.io 服務器一起使用。 參見: https : //stackoverflow.com/a/19522754/627663

您可以使用標准的 javascript websocket API,而不是使用 socket.io-client,該 API 現在適用於大多數瀏覽器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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