Question

Est-il possible d'utiliser Socket.io de manière transversale? Si c'est le cas, comment? La possibilité est mentionnée sur le Web, mais aucun exemple de code n'est donné nulle part.

Était-ce utile?

La solution

Citant le socket.io faq:

Socket.io prend-il en charge les connexions transversales?

Absolument, sur chaque navigateur!

Quant à la façon dont il le fait: les websockets natifs sont inter-domaines par conception, Socket.io sert un fichier de stratégie flash pour la communication flash inter-domaine, XHR2 peut utiliser CORS, et enfin vous pouvez toujours utiliser JSONP.

Autres conseils

** Version Socket.io -> 1.3.7 **

Est-il possible d'utiliser Socket.io de manière transversale? Oui absolument.

Si c'est le cas, comment?

Option 1: Forcez une utilisation de WebSockets uniquement

Par défaut, WebSockets est un domaine croisé. Si vous forcez Socket.io à l'utiliser uniquement comme moyen de connecter le client et le serveur, vous êtes prêt à partir.

Du côté serveur

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

Côté client

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);

C'est ça. Problème? Ne fonctionnera pas sur les navigateurs (pour les clients) qui ne prennent pas en charge les websockets. Avec cela, vous tuez à peu près la magie qu'est Socket.io, car elle commence progressivement par un long sondage pour passer plus tard vers les webockets (si le client le prend en charge.)

Si vous êtes sûr à 100% que tous vos clients accéderont avec des navigateurs conformes à HTML5, vous êtes prêt à partir.

Option 2: Autorisez les COR côté serveur, laissez Socket.io gérer s'il faut utiliser les websockets ou un sondage long.

Pour ce cas, il vous suffit d'ajuster la configuration côté serveur. La connexion client est la même que toujours.

Du côté serveur

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

C'est ça. J'espère que cela aide quelqu'un d'autre.

Insérez simplement votre nom de domaine distant lors de la création de la prise latérale du client:

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

Socket.io prend en charge les connexions croisées, mais gardez à l'esprit que votre cookie ne sera pas transmis au serveur. Vous devrez soit:

(1) Trouvez un autre schéma d'identification (un jeton personnalisé ou un cookie JavaScript - gardez à l'esprit que cela ne devrait pas être l'identifiant de session réellement, à moins que vous ne vouliez vous mettre en danger de détournement de session)

ou (2) envoyez d'abord une bonne demande HTTP JSONP à l'ancienne pour obtenir le cookie. Ensuite, il sera transmis avec la poignée de main de la connexion à socket.

Facile et sécurité!

Dans le fichier principal, placez-le avant io.on ('connexion'), ajoutez les lignes:

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

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

Oui. J'ai implémenté Cross Domain Socket.io pour tester si cela fonctionne.

<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>

Cela devrait bien fonctionner.

Créez votre serveur par IO comme ceci:

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')});

Dans le tableau d'origine, spécifiez l'origine valide

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top