2011-01-20 22 views
54

Come inviare i dati aggiuntivi alla connessione socket?Inviare dati aggiuntivi sulla connessione socket

Cliente:

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

Node.js Server:

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

Per esempio l'invio di un nome utente o indirizzo e-mail, ecc

risposta

11

Gli connection eventi vengono licenziati, non appena il protocollo TCP la connessione è stabilita. Non c'è modo di inviare nulla in mezzo.

Quello che puoi fare è semplicemente prendere il primo messaggio inviato dal server e inserire i dati in quel messaggio. Consiglio vivamente di eseguire alcuni protocolli sottili per questo, in modo da avere più tipi di messaggi e utilizzarli per determinare come il codice deve elaborare i dati.

Anche questo potrebbe essere più estensibile, dal momento che è abbastanza facile creare un'architettura generica per questo. Se si desidera attendere l'arrivo dello userdata, è sufficiente aggiungere uno stato alle proprie connessioni.

+0

Hey Ivo, Grazie mille per tornare a me. Puoi darmi un po 'di dettagli su come ottenere ciò che stai dicendo? Grazie ancora! – Dan

+0

Fondamentalmente, ho un'app di chat funzionante, dove è possibile inviare a client specifici. Il problema è che non ho modo di abbinare il sessionId con il nome utente. Quindi, se tu ed io stessimo parlando, invece di dire "Dan" e "Ivo" mostrerebbe l'ID del cliente. – Dan

+0

Puoi darmi qualche informazione in più sulla tua architettura/codice? Da dove vengono gli ID e da dove provengono i nomi?L'app non può fare semplicemente una richiesta al server e chiedere i nomi utente associati agli ID? Il nome utente –

4

questo mio codice per l'invio di dati di query per nodejs e client server di 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); 
}); 

interrogazione ... user1

16

ho un approccio diverso - emettere un evento dopo il collegamento, con i dati:

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

È possibile tenere una variabile/oggetto, e dire, quando non c'è ehlo evento con i dati, gli altri eventi vengono ignorati fino a quando viene inviato ehlo.

Se questo non soddisfa, è possibile inviare i dati a destra quando ci si collega, non mi copiare il codice, ma è in questa risposta: https://stackoverflow.com/a/13940399/1948292

+0

Questo è un buon approccio per il passaggio dei dati per identificare un utente, come un token di accesso. Potresti anche voler gestire 'socket.on ('riconnetti', ...)' se il tuo server ha bisogno di dati, potrebbe smettere di persistere dopo una disconnessione. –

37

Si dovrebbe inviare i tuoi dati sia in connessione o creare:

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

Con il new version of socket.io, sul server di è dove le cose sono state cambiate:

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

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

Ho visto altre persone dire di usare 'socket.request.query', ma questo non funziona per me su socket.io v1.7.2. Sicuramente dovremo usare 'socket.request._query'. – kellen

+0

Perché non c'è documentazione su questo? https://github.com/socketio/socket.io-client/blob/master/docs/API.md#iourl-options – rocketspacer

+1

Per socket.io v1.7.3, ho dovuto usare 'socket.handshake.query' (tramite [questa risposta] (http://stackoverflow.com/questions/13745519/send-custom-data-along-with-handshakedata-in-socket-io)). –

Problemi correlati