Est-il possible d'utiliser Socket.IO de façon interdomaine? Si c'est le cas, comment? La possibilité est mentionnée sur le Web mais aucun exemple de code n’est donné nulle part.
Citer le socket.io FAQ :
Socket.IO prend-il en charge les connexions entre domaines?
Absolument, sur tous les navigateurs!
Pour ce qui est de savoir comment cela fonctionne: les WebSockets natifs sont multi-domaines de par leur conception, socket.io sert un fichier de stratégie flash pour la communication flash entre domaines, XHR2 peut utiliser CORS et, enfin, vous pouvez toujours utiliser JSONP.
** Version Socket.IO -> 1.3.7 **
Est-il possible d'utiliser Socket.Io de façon interdomaine? Oui absolument.
Si c'est le cas, comment?
Option 1: Forcer l'utilisation de Websockets uniquement
Par défaut, les websockets sont interdomaines. Si vous forcez Socket.io à ne l'utiliser que comme moyen de connecter le client et le serveur, vous pouvez continuer.
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 tout. Problème? Ne fonctionnera pas sur les navigateurs (pour les clients) qui ne supportent pas les websockets. Avec cela, vous supprimez la magie de Socket.io, qui commence progressivement par une longue interrogation pour une mise à niveau ultérieure vers des websockets (si le client le prend en charge).
Si vous êtes sûr à 100% que tous vos clients auront accès à des navigateurs compatibles avec HTML5, vous pouvez continuer.
Option 2: autorisez le serveur CORS côté serveur, laissez Socket.io déterminer s'il convient d'utiliser des websockets ou une longue interrogation.
Dans ce cas, il vous suffit de régler la configuration côté serveur. La connexion client est la même, comme 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 tout. J'espère que ça aide quelqu'un d'autre.
Insérez simplement votre nom de domaine distant lors de la création du socket côté client:
var socket = io.connect('http://example.com:8080');
Socket.io prend en charge les connexions inter-domaines, mais gardez à l'esprit que votre cookie ne sera pas transmis au serveur. Vous devrez soit:
(1) proposer un schéma d'identification alternatif (un jeton personnalisé ou un cookie javascript - gardez simplement à l'esprit que cela ne devrait pas être l'identifiant de session, à moins que vous ne couriez le risque d'être détourné)
ou (2) envoyez d'abord une bonne requête HTTP JSONP au serveur pour obtenir le cookie. Ensuite, il sera transmis avec la connexion de connexion prise.
Facile et sécurisé!
Dans le fichier principal, placez-le avant io.on ('connection'), ajoutez les lignes:
io.set('origins', 'yoursite.com:*');
io.on('connection', function (socket) {
Oui. J'ai implémenté interdomaine socket.io pour tester son fonctionnement.
<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 origins, spécifiez l'origine valide