我正在尝试让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客户端脚本,该脚本可以很好地连接到服务器,所以我对丢失的内容有些迷茫。
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
代替使用socket.io-client,您可以使用标准的javascript websocket API,这些API在当今大多数浏览器中都可以使用。