Socket.IO中的跨域连接

Cam*_*mel 27 javascript cross-domain websocket cors socket.io

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

igo*_*orw 28

引用socket.io FAQ:

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

绝对是,在每个浏览器上!

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

  • 我实际上遇到了Cross Domain socket.io连接的一些问题.当socket.io恢复为XHR-Polling/Ajax时,socket.io会尝试向当前域/socket.io/1发出请求,这会导致******上的'***onClose***'不能***.谷歌搜索这个错误引起了几个github问题,但没有任何适用于我的情况(**因为我认为这是一个配置问题,而不是一个错误**). (3认同)
  • 这个答案是过时的方式.浏览器在webSockets上实现同源保护,就像它们对Ajax调用一样.如果要允许跨源socket.io连接,则必须在socket.io服务器中显式启用. (3认同)

Cha*_*mor 20

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

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

如果是这样,怎么样?

选项1:仅强制使用Websockets

默认情况下,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' ]);
Run Code Online (Sandbox Code Playgroud)

客户端

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);
Run Code Online (Sandbox Code Playgroud)

而已.问题?不适用于不支持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();
 });
Run Code Online (Sandbox Code Playgroud)

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

  • @tanwaniniranjan很高兴它可以帮助你^ _ ^(虽然我是'女老板',呵呵). (3认同)
  • 呵呵,好吧!女士,老板,:) (2认同)

vin*_*yll 17

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

var socket = io.connect('http://example.com:8080');
Run Code Online (Sandbox Code Playgroud)


mik*_*eil 8

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

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

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