2011-01-20 11 views
54

¿Cuál es la mejor forma de enviar datos adicionales al conectar un socket?Envíe datos adicionales sobre la conexión de socket

Cliente:

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

Node.js Servidor:

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

Por ejemplo el envío de un nombre de usuario o dirección de correo electrónico, etc.

Respuesta

11

Los connection eventos son despedidos tan pronto como el TCP la conexión está establecida. No hay forma de enviar nada en el medio.

Lo que puede hacer es simplemente tomar el primer mensaje enviado por el servidor y poner los datos en ese mensaje. Sugiero encarecidamente rodar algún protocolo delgado para esto, por lo que tendría múltiples tipos de mensajes y los usaría para determinar cómo el código debería procesar los datos.

Esto sería más extensible también, ya que es bastante fácil crear una arquitectura genérica para eso. Si quiere esperar a que el userdata entre primero, simplemente puede agregar un estado a sus conexiones.

+0

Hey Ivo, muchas gracias por volver a mí. ¿Me puede dar un poco más de detalles sobre cómo lograr lo que está diciendo? ¡Gracias de nuevo! – Dan

+0

Básicamente, tengo una aplicación de chat en funcionamiento, donde puedes enviarla a clientes específicos. El problema es que no tengo forma de hacer coincidir la sessionId con el nombre de usuario. Entonces, si tú y yo estuviéramos chateando, en lugar de decir "Dan" e "Ivo", mostraría la identificación del cliente. – Dan

+0

¿Me puede dar un poco más de información sobre su arquitectura/código? ¿De dónde vienen los ID y de dónde vienen los nombres?¿No puede la aplicación no solo hacer una solicitud al servidor y pedir los nombres de usuario que están asociados con los ID? –

4

esta mi código para el envío de datos de consulta a nodejs y cliente del servidor 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); 
}); 

consulta ... usuario1

16

Tengo un enfoque diferente - emito un evento justo después de la conexión, con los datos:

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

Puede mantener una variable/objeto, y decir, cuando no hay ehlo evento con los datos, los otros eventos se ignoran hasta que se envía ehlo.

Si esto no satisface, puede enviar datos directamente al conectar, no me copia el código, pero es en esta respuesta: https://stackoverflow.com/a/13940399/1948292

+0

Este es un buen enfoque para pasar datos para identificar a un usuario, como un token de acceso. También es posible que desee manejar 'socket.on ('reconnect', ...)' si su servidor necesita datos, podría dejar de persistir después de una desconexión. –

37

Usted debe enviar sus datos, ya sea en la conexión o en crear:

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 la new version of socket.io, en el servidor es donde las cosas han cambiado:

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

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

He visto a otras personas decir 'socket.request.query', pero eso no funciona para mí en socket.io v1.7.2. Definitivamente tiene que usar 'socket.request._query'. – kellen

+0

¿Por qué no hay documentación sobre esto? https://github.com/socketio/socket.io-client/blob/master/docs/API.md#iourl-options – rocketspacer

+1

Para socket.io v1.7.3, tuve que usar 'socket.handshake.query' (a través de [esta respuesta] (http://stackoverflow.com/questions/13745519/send-custom-data-along-with-handshakedata-in-socket-io)). –

Cuestiones relacionadas