如何使Socket.IO客户端连接到Python3 Websocket服务器

问题描述 投票:3回答:2

我正在尝试让Socket.IO客户端连接到使用aaugustin's websockets library和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客户端脚本,该脚本可以很好地连接到服务器,所以我对丢失的内容有些迷茫。

python sockets flask socket.io python-3.4
2个回答
2
投票

Access-Control-Allow-Origin似乎暗示我正在尝试向具有不同主机名的位置发出请求,但我没有这样做。

对于许多实现,不同的端口被认为是不同的来源。从https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy

如果两个页面的协议,端口(如果指定了一个)和主机相同,则两个页面具有相同的来源


0
投票

我相信这是不可能的。 Socket.io实现自己的协议,因此您不能将socket.io-client与非socket.io服务器一起使用。请参阅:https://stackoverflow.com/a/19522754/627663

代替使用socket.io-client,您可以使用标准的javascript websocket API,这些API在当今大多数浏览器中都可以使用。

© www.soinside.com 2019 - 2024. All rights reserved.