web-dev-qa-db-fra.com

Envoyer des données supplémentaires sur la connexion de socket

Comment envoyer au mieux des données supplémentaires lors d'une connexion socket?

Client:

socket.on('connect',function(){ 
//I'd like set some values and pass them up to the node server.
});

Serveur Node.js:

io.on('connection', function(client){
//I'd like to get the data here.
});

Par exemple, envoyer un nom d'utilisateur ou une adresse e-mail, etc.

66
Dan

Vous devez envoyer vos données en connexion ou lors de la création:

var s = io('http://216.157.91.131:8080/', { query: "foo=bar" });
s.connect();

var c = io.connect('http://216.157.91.131:8080/', { query: "foo=bar" });

Avec nouvelle version de socket.io , sur le serveur, c'est là que les choses ont été modifiées:

var io = require('socket.io')(server);

io.use(function(socket, next) {
  var handshakeData = socket.request;
  console.log("middleware:", handshakeData._query['foo']);
  next();
});
52
Miquel

J'ai une approche différente - émettre un événement juste après la connexion, avec les données:

socket.on('connect',function(){ 
    // Send ehlo event right after connect:
    socket.emit('ehlo', data);
});

io.on('connection', function(client){
    // Receive ehlo event with data:
    client.on('ehlo', function(data) {
    });
});

Vous pouvez contenir une variable/un objet et dire, lorsqu'il n'y a pas d'événement ehlo avec des données, les autres événements sont ignorés jusqu'à ce que ehlo soit envoyé.

Si cela ne vous satisfait pas, vous pouvez envoyer des données dès la connexion, je ne copierai pas le code mais c'est dans cette réponse: https://stackoverflow.com/a/13940399/1948292

23
Daniel W.

Les événements connection sont déclenchés dès que la connexion TCP est établie. Il n'y a aucun moyen d'envoyer quoi que ce soit entre les deux.

Ce que vous pouvez faire, c'est simplement prendre le premier message envoyé par le serveur et mettre les données dans ce message. Je suggère fortement de lancer un protocole léger pour cela, de sorte que vous auriez plusieurs types de messages et que vous les utiliseriez pour déterminer comment le code devrait traiter les données.

Ce serait plus extensible aussi, car il est assez facile de trouver une architecture générique pour cela. Si vous voulez attendre que userdata entre en premier, vous pouvez simplement ajouter un état à vos connexions.

12
Ivo Wetzel

ce mon code pour envoyer des données de requête à nodejs et client serveur server.io

var socket = io.connect(window.location.Origin,{query:'loggeduser=user1'});

io.sockets.on('connection', function (socket) {
    var endp = socket.manager.handshaken[socket.id].address;
    console.log("query... " +  socket.manager.handshaken[socket.id].query.user);
});

requête ... utilisateur1

6
mukut

J'ai trouvé la réponse située ici très utile à cet égard: Envoyer des données personnalisées avec handshakeData dans socket.io?

La mise à jour de la documentation suivante permet également d'expliquer les moyens de lier des variables à l'objet de prise de contact accessible à partir de l'objet socket pendant la connexion: https://github.com/LearnBoost/socket.io/wiki/Authorizing # autorisation-globale

5
Art Geigel

c'est mon code sur la version de socket 2.1.1

//client side
var socket = io.connect(window.location.Origin,{query:'loggeduser=user1'});

// server side
io.socket.on('connection', function (socket) {
    console.log("loggeduser => " +  socket.handshake.query.loggeduser);
});
2
Manoj Rana