Подтвердить что ты не робот

Междоменное соединение в Socket.IO

Можно ли использовать Socket.IO в кросс-доменном режиме? Если да, то как? Возможность упоминается в Интернете, но примеры кода не приведены нигде.

4b9b3361

Ответ 1

Цитирование socket.io FAQ:

Поддерживает ли Socket.IO междоменные подключения?

Абсолютно в каждом браузере!

Что касается этого: родные WebSockets являются междоменными по дизайну, socket.io служит для файла флэш-политики для междоменной флэш-связи, XHR2 может использовать CORS, и, наконец, вы всегда можете использовать JSONP.

Ответ 2

** Версия Socket.IO → 1.3.7 **

Можно ли использовать Socket.Io в кросс-доменном режиме? Да, абсолютно.

Если да, то как?

Вариант 1: принудительное использование только веб-узлов

По умолчанию веб-сокеты являются перекрестными доменами. Если вы заставляете 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);

Что это. Проблема? Не будет работать в браузерах (для клиентов), которые не поддерживают веб-узлы. С этим вы в значительной степени уничтожаете магию Socket.io, так как она постепенно начинает с длинного опроса для последующего обновления до websockets (если клиент поддерживает его.)

Если вы на 100% уверены, что все ваши клиенты будут иметь доступ с браузерами, совместимыми с HTML5, тогда вам будет хорошо.

Вариант 2: разрешить CORS на стороне сервера, разрешить Socket.io обрабатывать использование веб-узлов или длительный опрос.

В этом случае вам нужно только настроить настройку на стороне сервера. Клиентское соединение такое же, как всегда.

Серверная сторона

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

Что это. Надеюсь, это поможет кому угодно.

Ответ 3

Просто введите свое удаленное доменное имя при создании сокета на стороне клиента:

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

Ответ 4

Socket.io поддерживает междоменные подключения, но имейте в виду, что ваш файл cookie не будет передан серверу. Вам придется либо:

(1) придумать альтернативную схему идентификации (пользовательский токен или куки файл javascript), просто имейте в виду, что это не должен быть идентификатор сеанса, если вы не хотите подвергать себя риску захвата сеанса)

или (2) отправьте старый добрый HTTP-запрос JSONP на сервер сначала, чтобы получить файл cookie. Затем он будет передан с помощью рукопожатия сокета.

Ответ 5

Простота и безопасность!

В основном файле поместите его перед io.on('connection'), добавьте строки:

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

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

Ответ 6

Да, да. Я применил cross domain 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>

Это должно работать нормально.

Ответ 7

Создайте свой сервер с помощью 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')});

в массиве происхождений укажите действительное происхождение