Socket.IO中的跨域连接

IT技术 javascript websocket socket.io cors cross-domain
2021-02-25 03:55:23

是否可以跨域使用 Socket.IO?如果是这样,如何?网络上提到了这种可能性,但在任何地方都没有给出代码示例。

6个回答

引用socket.io 常见问题解答

Socket.IO 是否支持跨域连接?

绝对,在每个浏览器上!

至于它是怎么做到的:Native WebSockets 是跨域设计的,socket.io 为跨域 flash 通信提供了一个 flash 策略文件,XHR2 可以使用 CORS,最后你总是可以使用 JSONP。

这个答案已经过时了。浏览器在 webSockets 上实现同源保护,就像它们对 Ajax 调用所做的一样。如果您希望允许跨源 socket.io 连接,则必须在 socket.io 服务器中显式启用。
2021-05-07 03:55:23
我实际上遇到了跨域 socket.io 连接的一些问题。当 socket.io 恢复为 XHR-Polling/Ajax 时,socket.io 尝试向当前域 /socket.io/1 发出请求,这会导致无法nullonClose谷歌搜索这个错误会带来几个 github 问题,但没有任何适用于我的情况(因为我认为这是一个配置问题,而不是一个错误)。
2021-05-16 03:55:23

**Socket.IO 版本 --> 1.3.7 **

是否可以跨域使用 Socket.Io? 是的,一点没错。

如果是这样,如何?

选项 1:仅强制使用 Websocket

默认情况下,websockets 是跨域的。如果您强制 Socket.io 仅将其用作连接客户端和服务器的方式,那么您就可以开始了。

服务器端

//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);

而已。问题?不适用于不支持 websockets 的浏览器(对于客户端)。有了这个,你几乎可以杀死 Socket.io 的魔力,因为它逐渐开始长轮询,然后升级到 websockets(如果客户端支持它)。

如果您 100% 确定您的所有客户端都可以使用符合 HTML5 的浏览器访问,那么您就可以开始了。

选项2:在服务器端允许CORS,让Socket.io处理是使用websockets还是长轮询。

对于这种情况,您只需要调整服务器端设置。客户端连接与往常一样。

服务器端

//HTTP Server 
var express=require('express');
//Express instance
var app = express();

//ENABLE CORS
app.all('/', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
 });

而已。希望它可以帮助其他人。

创建客户端套接字时只需插入您的远程域名:

var socket = io.connect('http://example.com:8080');
太旧的答案。io.connect 不是一个函数。
2021-04-24 03:55:23
io.connect应该仍然有效(2016 年):socket.io/docs/#using-with-express-3/4另请参阅 socket.io/docs/client-api/:“connect连接成功时触发”。
2021-04-29 03:55:23

Socket.io 支持跨域连接,但请记住,您的 cookie 不会传递到服务器。您必须:

(1) 提出一个替代的识别方案(一个自定义令牌或一个 javascript cookie——请记住这不应该是实际的会话 ID,除非你想让自己面临会话劫持的风险)

或 (2) 首先向服务器发送一个很好的老式 HTTP JSONP 请求以获取 cookie。然后它将通过套接字连接握手进行传输。

卡在确切的问题上,我无法将 cookie 传递给服务器。以角度实现这一目标的最佳实践是什么
2021-05-05 03:55:23

通过 io 创建您的服务器,如下所示:

const server = require('http').createServer();

const io = require('socket.io')(server, {
    origins:["127.0.0.1:8000"],
    path: '/',
    serveClient: false,
    // below are engine.IO options
    pingInterval: 20000,
    pingTimeout: 5000,
    cookie: false
});

io.on('connection', function(socket){
    console.log("here new user welcom")
});


server.listen(3000,function(){
    console.log('listening on *:3000')});

在 origins 数组中指定有效的原点

我必须使用 origin 而不是 origins ,否则这对我有帮助,即 origin: [" 127.0.0.1","https://127.0.0.1"] ,
2021-05-10 03:55:23