我试图让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客户端脚本,所以我对丢失的内容感到有点迷失。
答案 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在当今大多数浏览器中都可以使用。