web-dev-qa-db-fra.com

Connectez-vous au serveur Socket.IO avec un chemin d'accès et un espace de noms spécifiques

Mon application Node.js s'exécute à l'URL http://www.example.com/myapp/ .

J'ai configuré un serveur Socket.IO (version 1.3.5) avec un espace de noms personnalisé. Voici un exemple d'extrait de code:

var server = http.createServer(...);
var io = socketio(server);
io
    .of('/a/b/c')
    .on('connection', function (socket) {
        socket.emit('update', {msg: '/a/b/c'});
    });

Je ne peux pas comprendre comment me connecter à ce service à partir du client. Mes suppositions (rien de tout cela ne fonctionne):

io.connect('http://www.example.com/myapp/a/b/c');
io.connect('http://www.example.com', {path: '/myapp/a/b/c'});
io.connect('', {path: '/myapp/a/b/c'});
io.connect('http://www.example.com/a/b/c', {path: '/myapp'});
io.connect('http://www.example.com', {path: '/myapp/socket.io/a/b/c'});
27
guidoman

Sur votre serveur, n'oubliez pas de spécifier également le chemin:

var io  = require('socket.io')(http, { path: '/myapp/socket.io'});

io
.of('/my-namespace')
.on('connection', function(socket){
    console.log('a user connected with id %s', socket.id);

    socket.on('my-message', function (data) {
        io.of('my-namespace').emit('my-message', data);
        // or socket.emit(...)
        console.log('broadcasting my-message', data);
    });
});

Sur votre client, ne confondez pas espace de noms et chemin:

var socket = io('http://www.example.com/my-namespace', { path: '/myapp/socket.io'});
57
pieterjandesmedt

J'utilise aussi 1.3.5, dans un scénario légèrement similaire, à partir d'une application à une seule page Angular, où le code client pour socket.io est juste concaténé avec le reste de l'application (à partir de un package Bower), plutôt que téléchargé/inclus à partir d'un emplacement réseau particulier.

Ce qui semble fonctionner pour moi dans la configuration où se trouve mon socket.io:

http://somedomain.com:9096/sockets/socket.io.js

plutôt que par défaut:

http://somedomain.com:9096/socket.io/socket.io.js

(J'ai ajusté manuellement le chemin côté serveur), c'est:

io.connect('http://somedomain.com:9096' + '/' + namespaceName, { path: '/sockets' });

Cela ressemble à votre scénario:

io.connect('http://www.example.com/a/b/c', {path: '/myapp'});

qui peut valoir la peine d'être réessayé. Je n'ai pas entièrement testé le namespaceName avec des barres obliques, mais il semble reprendre la connexion côté client, lorsque je change simplement mon espace de noms en '/a/b/c'

Ce qui fait probablement la différence, c'est ma configuration côté serveur, qui va:

var server = http.createServer(app);
var io = require('socket.io')(server, { path: '/sockets' }).listen(server);

Ma réponse est plus une indication générale qu'il est possible d'utiliser à la fois un espace de noms et un chemin personnalisé, malgré la configuration n'est pas évidente. J'espère que cela peut vous être utile d'une manière ou d'une autre.

7
Wojtek

Vous pouvez consulter la documentation officielle sur Rooms and Namespaces . Fondamentalement, la grande chose à propos de socket.io est que, une fois que votre client demande les sources côté client, il transmettra tous les détails nécessaires pour que le client se connecte au serveur (hôte, chemin, port, etc.).

Pour vous connecter à votre espace de noms spécifique, sur le client, vous devrez simplement spécifier:

var socket = io('/a/b/c');
1
Filip Dupanović