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

时间:2015-06-14 04:03:13

标签: python sockets flask socket.io python-3.4

我试图让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客户端脚本,所以我对丢失的内容感到有点迷失。

2 个答案:

答案 0 :(得分:2)

  

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

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

  

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

答案 1 :(得分:0)

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

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