//HTTP Server
var server = require('http').createServer(app).listen(8888);
var io = require('socket.io').listen(server);
//Allow Cross Domain Requests
io.set('transports', [ 'websocket' ]);
客户端 *
var connectionOptions = {
"force new connection" : true,
"reconnectionAttempts": "Infinity", //avoid having user reconnect manually in order to prevent dead clients after a server restart
"timeout" : 10000, //before connect_error and connect_timeout are emitted.
"transports" : ["websocket"]
};
var socket = io("ur-node-server-domain", connectionOptions);
8条答案
按热度按时间2jcobegt1#
引用socket.io常见问题解答:
Socket.IO是否支持跨域连接?
绝对的,在每个浏览器上!
至于它是如何做到的:原生WebSockets是跨域设计的,socket.io为跨域闪存通信提供闪存策略文件,XHR 2可以使用CORS,最后,您可以始终使用JSONP。
xxhby3vn2#
套接字.IO版本--〉1.3.7
选项1:仅强制使用Websockets
默认情况下,websockets是跨域的。如果你强迫Socket.io只使用它作为连接客户端和服务器的手段,你就可以开始了。
就是这样。问题?在不支持websockets的浏览器(客户端)上无法工作。有了这个,你几乎扼杀了www.example.com的魔力Socket.io,因为它逐渐开始长时间的轮询,然后升级到websockets(如果客户端支持的话)。
如果您100%确定您的所有客户端都将使用HTML5兼容的浏览器进行访问,那么您就可以开始了。
选项2:允许服务器端的CORS,让Socket.io处理是否使用websockets或长轮询。
在这种情况下,您只需要调整服务器端的设置。客户端连接与往常一样。
就这样希望能对其他人有所帮助。
sd2nnvve3#
在创建客户端套接字时,只需插入您的远程域名:
关于MDN的一些文档
但是,您应该确保您的服务器接受websockets(配置和头)。
旧版本:
uubf1zoe4#
Socket.io 支持跨域连接,但请记住,您的cookie不会被传递到服务器。您必须:
(1)提出一个替代的标识方案(一个自定义令牌或一个javascript cookie--记住这不应该是实际的会话id,除非您想让自己处于会话劫持的风险中)
或者(2)首先向服务器发送一个好的老式HTTPJSONP请求以获取cookie。然后它将通过套接字连接握手进行传输。
bvk5enib5#
使用io创建服务器,如下所示:
在原点数组中指定有效的原点
cu6pst1q6#
方便又安全!
在主文件中,将其放在io.on('connection')之前,添加以下行:
yvt65v4c7#
是的。我已经实现了跨域socket.io来测试它是否工作。
应该没问题。
f3temu5u8#
从v4开始,根据the docs:
从Socket.IO v3开始,你需要显式地启用Cross-Origin Resource Sharing(CORS)。
您可以在传递给
new Server()
的配置对象中使用cors
键。请参阅basic example from the above docs page:origin
可以是接受多个来源的数组。其他选项包括
allowRequest
、allowedHeaders
、withCredentials
、extraHeaders
和cors
封装中的其他选项,该封装最终可处理CORS接头。我还测试了与this answer稍有不同的语法,this answer在4.4.1中适用: