Кросс-доменное соединение в Socket.IO - PullRequest
27 голосов
/ 23 января 2012

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

Ответы [ 7 ]

28 голосов
/ 23 января 2012

Цитата socket.io FAQ :

Поддерживает ли Socket.IO междоменные соединения?

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

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

20 голосов
/ 25 ноября 2015

** Версия 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, поскольку оно постепенно начинается с длинного опроса для последующего обновления до веб-сокетов (если клиент поддерживает это).

Если вы на 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();
 });

Вот и все.Надеюсь, это кому-нибудь еще поможет.

17 голосов
/ 08 сентября 2012

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

var socket = io.connect('http://example.com:8080');
8 голосов
/ 09 мая 2013

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

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

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

3 голосов
/ 21 сентября 2015

Легко и безопасно!

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

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

io.on('connection', function (socket) {
1 голос
/ 22 октября 2015

Да, это так. Я реализовал кросс-домен 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>

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

0 голосов
/ 16 января 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...