Połączenie między domenami w Socket.IO

Czy możliwe jest użycie Socket.IO w sposób cross domeny? Jeśli tak, to w jaki sposób? Możliwość jest wymieniana w Internecie, ale nigdzie nie podano przykładów kodu.

Author: Michał Perłakowski, 2012-01-23

6 answers

Cytowanie socket.io FAQ:

Czy Socket.IO obsługuje połączenia między domenami?

Absolutnie, na każdej przeglądarce!

Co do tego, jak to robi: natywne Websockety są projektowane między domenami, socket.io xhr2 może używać CORS, a w końcu zawsze możesz używać JSONP.

 28
Author: igorw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-23 12:13:29

Po prostu wstaw nazwę zdalnej domeny podczas tworzenia gniazda po stronie klienta:

var socket = io.connect('http://example.com:8080');
 17
Author: vinyll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 06:27:41

**Socket.IO Wersja --> 1.3.7 **

czy możliwe jest użycie Socket.Io w sposób cross domeny? Tak, oczywiście.

Jeśli tak, to w jaki sposób?

Opcja 1: Wymuś użycie tylko Websockets

Domyślnie websockets są cross domain. Jeśli wymusisz Socket.io aby używać go tylko jako środka do połączenia klienta i serwera, jesteś dobry, aby przejść.

strona serwera

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

strona klienta

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);
To wszystko. Problem? Nie działa na przeglądarkach (dla klientów), które nie obsługują websockets. Dzięki temu zabijasz magię, która jest Socket.io, ponieważ stopniowo zaczyna się od długiego ankietowania, aby później uaktualnić do websockets (jeśli klient go obsługuje.)

Jeśli jesteś w 100% pewien, że wszyscy twoi klienci będą mieli dostęp do przeglądarek zgodnych z HTML5,jesteś gotowy.

Opcja 2: Zezwól CORS po stronie serwera, pozwól Socket.io uchwyt czy używać websockets lub long polling.

W tym przypadku, musisz tylko dostosować konfigurację po stronie serwera. Połączenie z Klientem jest takie samo jak zawsze.

strona serwera

//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();
 });
To wszystko. Mam nadzieję, że komuś to pomoże.
 15
Author: Chayemor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-25 09:15:00

Socket.io obsługuje połączenia między domenami, ale pamiętaj, że Twój plik cookie nie zostanie przekazany na serwer. Będziesz musiał albo:

(1) wymyśl alternatywny schemat identyfikacji (Niestandardowy token lub plik cookie javascript-pamiętaj, że nie powinien to być rzeczywisty identyfikator sesji, chyba że chcesz narażać się na ryzyko przejęcia sesji)

Lub (2) Wyślij najpierw do serwera stare dobre żądanie HTTP JSONP, aby uzyskać plik cookie. Wtedy będzie przesyłane w / gniazdo połączenie handshake.

 8
Author: mikermcneil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-09 03:22:52

Łatwe i bezpieczne!

W głównym pliku umieść go przed io.on ('connection'), dodaj linie:

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

io.on('connection', function (socket) {
 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-21 17:49:11

Tak. Zaimplementowałem cross domain socket.io aby sprawdzić, czy to działa.

<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>
To powinno zadziałać.
 1
Author: Kurt Campher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-22 11:22:21