Socket.IO中的跨域连接

时间:2012-01-23 11:26:14

标签: javascript websocket socket.io cors cross-domain

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

7 个答案:

答案 0 :(得分:28)

引用socket.io FAQ

  

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

     

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

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

答案 1 :(得分:20)

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

是否可以以跨域方式使用Socket.Io? 是的,绝对。

如果是,怎么做?

选项1:仅强制使用网页

默认情况下,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();
 });

就是这样。希望它可以帮助其他任何人。

答案 2 :(得分:17)

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

var socket = io.connect('http://example.com:8080');

答案 3 :(得分:8)

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

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

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

答案 4 :(得分:3)

简单安全!

在主文件中将它放在io.on之前(' connection'),添加以下行:

io.set('origins', 'yoursite.com:*');

io.on('connection', function (socket) {

答案 5 :(得分:1)

是的。 我已经实现了跨域socket.io来测试它是否有效。

<script src="http://your-nodejs-domain.com:3000/public/js/jquery.js"></script>
  <script src="http://your-nodejs-domain.com:3000/socket.io/socket.io.js"></script>
  <script>

      var socket = io.connect('http://your-nodejs-domain:3000');
      $(document).ready(function(){

          socket.on('test message', function(msg){
               console.log("Got the message: " + msg);
          });
      });

  </script>

这应该可以正常工作。

答案 6 :(得分:0)

像这样通过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数组中指定有效的原点