2012-07-06 44 views
12

He estado recorriendo la red sin suerte. Estoy intentando descubrir cómo enviar un mensaje privado de un usuario a otro. Hay muchos fragmentos, pero no estoy seguro de la interacción cliente/servidor. Si tengo el ID del socket al que deseo enviarlo, ¿cómo lo envío al servidor y cómo me aseguro de que el servidor solo envíe el mensaje a ese receptor?socket.io mensaje privado

¿Hay algún tutorial o tutorial que todos conozcan?

+0

He creado una matriz con todos los usuarios, y luego se usa io.sockets.socket .emit (identificación de usuario), pero todavía no está enviando. El archivo de servidor actualizado es [aquí] (http://pastebin.com/k770CEaM), y el archivo de cliente es [aquí] (http: // pastebin.com/V6Cdg113) ¡Si pudieras verlo, te lo agradecería! –

Respuesta

18

No se necesita un tutorial. El Socket.IO FAQ es bastante sencillo en este caso:

socket.emit('news', { hello: 'world' }); 

EDIT: La gente se están ligando a esta pregunta cuando le preguntamos sobre cómo conseguir que socket objeto más tarde. No hay necesidad de. Cuando un nuevo cliente se conecta, guarde una referencia a ese socket en cualquier objeto en el que esté manteniendo su información de usuario. Mi comentario de debajo:

En la parte superior de su secuencia de comandos en algún lugar, configure un objeto para contener la información de los usuarios.

var connectedUsers = {};

En su función .on('connection'), añadir que toma a su nuevo objeto. connectedUsers[USER_NAME_HERE] = socket; Luego puede recuperarlo fácilmente más tarde. connectedUsers[USER_NAME_HERE].emit('something', 'something');

+8

que se enviará al usuario con la ID de "noticias"? ¿Cuáles son las funciones de "noticias", "hola", "mundo"? No hay SIGNIFICADO en ese fragmento. ¿Cómo obtengo el mensaje y el usuario de destino del cliente? ... "socket.emit ('noticias', {hello: 'world'});" no es exactamente sencillo .. –

+1

No, eso levantará el evento 'news' para el cliente conectado a' socket'. El primer parámetro para la función que maneja ese evento será el objeto, '{hello: 'world'}'. Debe mantener una referencia a ese objeto de socket al conectarse para usarlo más adelante. – Brad

+0

También tenga en cuenta que * hay * una forma de obtener ese socket más adelante, pero es un poco complicado. Consulte: https://github.com/LearnBoost/socket.io/issues/503 Vea también: http://stackoverflow.com/questions/6913801/sending-message-to-specific-client-with-socket-io- and-empty-message-queue – Brad

6

La manera más fácil de lo que puedo pensar es tener un hash de todos los usuarios en el uso de su ID o el nombre como la clave y tienen su toma como parte del valor a continuación, cuando se desea enviar un mensaje a sólo les aprietas el zócalo y emiten en él ... algo como esto:

users[toUser].emit('msg',"Hello, "+toUser+"!"); 
16

He aquí un fragmento de código que debe ayudar

lado del cliente (envío de mensajes)

socket.emit("private", { msg: chatMsg.val(), to: selected.text() }); 

donde 'a' se refiere al identificador para enviar un mensaje privado a y 'msg' es el contenido

lado del cliente (recepción de mensajes)

socket.on("private", function(data) {  
    chatLog.append('<li class="private"><em><strong>'+ data.from +' -> '+ data.to +'</strong>: '+ data.msg +'</em></li>'); 

donde Registro de la charla es un div que muestra los mensajes de chat

lado del servidor

client.on("private", function(data) {   
     io.sockets.sockets[data.to].emit("private", { from: client.id, to: data.to, msg: data.msg }); 
    client.emit("private", { from: client.id, to: data.to, msg: data.msg }); 
    }); 
+0

En su código del lado del servidor, ¿qué es el cliente? ¿Por qué no socket.on? El código de chat_server.js es [aquí] (http://pastebin.com/nxHdzHDg), y el código del cliente es [example_chat.tpl.php] (http://pastebin.com/t0h7rSFv) –

+1

ok ... I descubrió que el cliente es solo el nombre que usaste para io.sockets.on ('connection'). –

+0

Has acertado. Lo siento, no fue obvio en el código. – almypal

1

en socket.io 1.0 uso

io.sockets.connected[<socketid>] 

puede almacenar solo id de socket. de este modo:

var users = {}; 
users[USER_NAME] = socket.id; 

a continuación:

io.sockets.connected[users[USER_NAME]] 
    .emit('private', { 
     msg:'private message for user with name '+ USER_NAME 
    });