2016-02-28 11 views
12

Używam Socket IO v1.4.5 i próbowałem 3 różnych sposobów poniżej, ale nie mam żadnego wyniku.Wysyłanie wiadomości do określonego klienta w Socket IO

client.emit('test', 'hahahaha'); 
io.sockets.socket(id).emit('test',''hahaha); 
io.sockets.connected[id].emit('test','hahaha'); 

Oto mój stronie serwera

var socket = require('socket.io'); 
var express = require('express'); 
var http = require('http'); 
var dateFormat = require('date-format'); 
var app = express(); 
var server = http.createServer(app); 
var io = socket.listen(server); 
io.sockets.on('connection', function(client) { 
    user[client.id]=client; 

//when we receive message 
    client.on('message', function(data) { 
     console.log('Message received from' + data.name + ":" + data.message +' avatar' +data.avatar); 
     client.emit('test', 'hahahaha'); 
}); 

Każda pomoc będzie great.Thanks dla help.Kind Regard

Odpowiedz

70

Aby wysłać wiadomość do konkretnego klienta trzeba to zrobić tak jak :

socket.broadcast.to(socketid).emit('message', 'for your eyes only'); 

Oto miły mały ściągawki dla gniazd:

// sending to sender-client only 
socket.emit('message', "this is a test"); 

// sending to all clients, include sender 
io.emit('message', "this is a test"); 

// sending to all clients except sender 
socket.broadcast.emit('message', "this is a test"); 

// sending to all clients in 'game' room(channel) except sender 
socket.broadcast.to('game').emit('message', 'nice game'); 

// sending to all clients in 'game' room(channel), include sender 
io.in('game').emit('message', 'cool game'); 

// sending to sender client, only if they are in 'game' room(channel) 
socket.to('game').emit('message', 'enjoy the game'); 

// sending to all clients in namespace 'myNamespace', include sender 
io.of('myNamespace').emit('message', 'gg'); 

// sending to individual socketid 
socket.broadcast.to(socketid).emit('message', 'for your eyes only'); 

zgłosił https://stackoverflow.com/a/10099325


Najprostszym sposobem zamiast wysyłania bezpośrednio do gniazdka, byłoby stworzenie pokój dla 2 użytkowników w obsłudze i po prostu wysłać wiadomości swobodnie tam.

socket.join('some-unique-room-name'); // Do this for both users you want to chat with each other 
socket.broadcast.to('the-unique-room-name').emit('message', 'blah'); // Send a message to the chat room. 

W przeciwnym razie będziesz musiał śledzić poszczególnych klientów połączenia gniazda, a gdy chcesz porozmawiać musisz patrzeć się gniazda i emitują specjalnie do tego jednego przy użyciu funkcji Powiedziałem powyżej. Pokoje są prawdopodobnie łatwiejsze.

+0

Hi.So Muszę tylko dodać, że linia na stronie serwera? Czy wszystko inne wygląda dobrze? –

+1

@ HoàngPhúcVũ Nie jestem w 100% pewien, co próbujesz osiągnąć w swoim kodzie, mówisz, że chcesz wysłać do określonego połączenia z gniazdem, ale nie widzę próby wyszukiwania identyfikatora gniazda i wysyłania do niego. – Datsik

+0

Czego chcę, to wysłać prywatną wiadomość między 2 użytkownikami. Czy masz jakieś sugestie na temat tego przypadku.dzięki za pomoc –

0

Socket.io wersja 2.0.3+

Wysyłanie wiadomości do określonego gniazda

let namespace = null; 
    let ns = _io.of(namespace || "/"); 
    let socket = ns.connected[socketId] // assuming you have id of the socket 
    if (socket) { 
     console.log("Socket Connected, sent through socket"); 
     socket.emit("chatMessage", data); 
    } else { 
     console.log("Socket not connected, sending through push notification"); 
    } 
Powiązane problemy