web-dev-qa-db-fra.com

Envoi de message à un client spécifique avec socket.io et file d'attente de messages vide

Je deviens fou avec socket.io! La documentation est tellement mauvaise que ce n’est tout simplement pas vrai.

Je souhaite envoyer un commentaire à un client spécifique via socket.io

Mon côté serveur ressemble à ceci:

app.get('/upload', requiresLogin, function(request, response) {
    response.render('upload/index.jade');
    io.sockets.on('connection', function (socket) {
        console.log('SOCKET ID ' + socket.id);
        io.sockets.socket(socket.id).emit('new', 'hello');
    });
});

et le côté client ressemble à ceci:

$(document).ready(function() {
    var socket = io.connect('http://localhost:80/socket.io/socket.io.js');
    socket.on('new', function (data) { 
        console.log(socket.id);
        console.log(data); 
        //$('#state').html(data.status);
    });
});

mais le client ne fait simplement rien. J'ai presque tout essayé. Quelqu'un peut-il me dire ce que je fais mal, s'il vous plaît! :(

36
Valeri K

pour envoyer un message à un client spécifique, enregistrez tous ceux qui se connectent au serveur dans un objet.

var socketio = require('socket.io');
var clients = {};
var io = socketio.listen(app);

io.sockets.on('connection', function (socket) {
  clients[socket.id] = socket;
});

vous pourrez ensuite faire quelque chose comme ceci:

var socket = clients[sId];
socket.emit('show', {});
53
pkyeck

Voici deux manières d’envoyer des commentaires à un client spécifique via socket.io:

  • Comme indiqué par pkyeck, enregistrez tous les clients dans un objet afin de pouvoir les envoyer ultérieurement à vos clients spécifiques dans vos gestionnaires d’itinéraires, par exemple:

    var sessionsConnections = {};
    sio.on('connection', function (socket) {
      // do all the session stuff
      sessionsConnections[socket.handshake.sessionID] = socket;
    });
    
  • ou, utilisez le support intégré de socket.io pour les salles - abonnez chaque client à une salle en connexion et envoyez-le via cette salle dans les gestionnaires d'itinéraire, par exemple:

    sio.on('connection', function (socket) {
      // do all the session stuff
      socket.join(socket.handshake.sessionID);
      // socket.io will leave the room upon disconnect
    });
    
    app.get('/', function (req, res) {
      sio.sockets.in(req.sessionID).send('Man, good to see you back!');
    });
    

Reconnaissance:

http://www.danielbaulig.de/socket-ioexpress/#comment-1158

Notez que ces deux exemples de solutions supposent que socket.io et express ont été configurés pour utiliser le même magasin de session et font donc référence aux mêmes objets de session. Voir les liens ci-dessus et ci-dessous pour plus de détails pour y parvenir:

https://github.com/LearnBoost/socket.io/wiki/Authorizing

18
Tom Rogers

2 choses

1) Vous devriez vraiment placer votre io.sockets.on(..) en dehors de votre route app/update afin d’empêcher l’ajout de plusieurs écouteurs pour les clients.

2) io.sockets.socket (id); ne devrait pas être utilisé, il aurait dû être socket.emit('new', 'hello')

7
3rdEden

Dans socket.io 1.0, voici comment cela fonctionnerait. Cela peut fonctionner pour les versions inférieures, mais je ne peux pas le garantir.

socket.to(socket_id_here).emit('new', 'hello');

Cela fonctionne car socket.io ajoute automatiquement un socket à une pièce avec l'identifiant du socket lors de la connexion.

En outre, si vous envisagez de mettre à niveau vers la version 1.0, de nombreuses modifications ont été apportées à l'API. Vous devrez donc parfois modifier du code pour que cela fonctionne dans la version 1.0.

5
Ferdi265

La manière correcte de faire cela dans Socket.io 1.0+ est:

io.to(users_socket_id).emit('new', 'hello');

Vous pouvez également substituer un nom de salle à "users_socket_id" à émettre vers une salle socket.io spécifique.

4
Williz

j'en ai marre de la dernière version de node et socket.io ci-dessous je vais poster le code complet

  <ul id="messages"></ul>
<form action="">
  <input id="id1"  /><button>Send</button>
</form>
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>

  var io = io.connect();
  $('form').submit(function(){
    io.emit('drumevent', $('#id1').val());
    $('#id1').val('');
    return false;
  });
  io.on('drumevent', function(msg){
  console.log(msg);



    $('#messages').append($('<li></li>').text(msg.message+'    quantity = '+msg.quantity));
  });
</script>

code côté serveur

  var usernames = {};io.on('connection', function(socket){usernames["username"] = socket.id;
socket.on('drumevent', function(msg){     
var socketId = socket.id;io.to(socketId).emit('drumevent', data);
0
Adiii

Je crois que io.sockets.socket a été supprimé et pose un problème dans Socket.IO ( https://github.com/socketio/socket.io/issues/1618 ).

Vous pouvez utiliser io.sockets.connected [socket.id] et stocker le socket.id à référencer avec l'utilisateur via le nom d'utilisateur:

var usernames = {};
usernames[username] = socket.id;
// Sending the message
io.sockets.connected[usernames[username]].emit(...);

Je ne le vois nulle part dans la documentation, ce qui me permet de voir comment on n'a pas répondu à cette question. De plus, si vous n'avez aucune référence via les noms d'utilisateur, vous pouvez plutôt essayer:

users[socket.id] = socket.id;

dupliquer la clé et la valeur pour un accès facile.

Il y a peut-être aussi une autre façon d'utiliser io.clients comme décrit ci-dessous, mais je n'ai pas utilisé cette méthode.

OTHER SOLUTION: Envoyer un message à un client spécifique avec socket.io et node.js

0
jsb

Avez-vous essayé d'utiliser?

var socket = io.connect('http://localhost:80/');