¿Cuál es la mejor manera de enviar datos adicionales tras la conexión del socket?
Cliente:
socket.on('connect',function(){
//I'd like set some values and pass them up to the node server.
});
Servidor Node.js:
io.on('connection', function(client){
//I'd like to get the data here.
});
Por ejemplo, enviando un nombre de usuario o una dirección de correo electrónico, etc.
socket.request.query
, pero eso no me funciona en socket.io v1.7.2. Definitivamente tengo que usarsocket.request._query
.socket.handshake.query
(a través de esta respuesta ).{ query: "foo=bar", "bar=foo" }
no funcionará.{query: 'var1='+foo+'&var2=bar'
Tengo un enfoque diferente: emito un evento justo después de conectarme, 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 ningún
ehlo
evento con datos, los otros eventos se ignoran hasta queehlo
se envía.Si esto no satisface, puede enviar datos directamente al conectarse, no copiaré el código, pero está en esta respuesta: https://stackoverflow.com/a/13940399/1948292
fuente
socket.on('reconnect', …)
si su servidor necesita datos que podrían dejar de persistir después de una desconexión.Los
connection
eventos se activan tan pronto como se establece la conexión TCP. No hay forma de enviar nada intermedio.Lo que puede hacer es simplemente tomar el primer mensaje enviado por el servidor y poner los datos en ese mensaje. Sugiero encarecidamente implementar un protocolo delgado para esto, de modo que tenga varios tipos de mensajes y los use para determinar cómo el código debe procesar los datos.
Esto también sería más ampliable, ya que es bastante fácil crear una arquitectura genérica para eso. Si desea esperar a
userdata
que llegue primero, simplemente puede agregar algún estado a sus conexiones.fuente
este es mi código para enviar datos de consulta a nodejs y server.io server client
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
fuente
Encontré la respuesta ubicada aquí realmente útil en este sentido: ¿ Enviar datos personalizados junto con handshakeData en socket.io?
También repasar la siguiente documentación ayuda a explicar las formas de vincular variables al objeto de protocolo de enlace al que se puede acceder desde el objeto de socket durante la conexión: https://github.com/LearnBoost/socket.io/wiki/Authorizing#global-authorization
fuente
este es mi código en la versión 2.1.1 del socket
//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); });
fuente
Supongo que usará SSL.
El uso de cadenas de consulta para enviar datos confidenciales no es una buena práctica de seguridad ( ¿por qué? ). Creo que si necesita enviar datos no confidenciales, entonces la respuesta de Miquel es la más rápida y fácil, pero si lo que necesita enviar son datos confidenciales, entonces algo como Daniel W. es el mejor enfoque a tomar.
Para un enfoque de autenticación, puede echar un vistazo a este proyecto de github ( socketio-auth ) que, más allá del hecho de que actualmente no tiene mantenimiento, puede darle una buena idea de cómo lidiar con el problema.
fuente