2016-02-28 18 views
12

Tôi đang sử dụng Socket IO v1.4.5 và đã thử 3 cách khác nhau bên dưới nhưng không có bất kỳ kết quả nào.Gửi tin nhắn đến khách hàng cụ thể trong Socket IO

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

Đây là phía máy chủ của tôi

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

Bất kỳ trợ giúp sẽ được great.Thanks cho help.Kind Regard

Trả lời

70

Để gửi tin nhắn đến một khách hàng cụ thể mà bạn cần phải làm điều đó như vậy :

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

Dưới đây là một số nhỏ gọn cheat sheet cho ổ cắm:

// 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'); 

tín dụng để https://stackoverflow.com/a/10099325


Cách đơn giản nhất chứ không phải là gửi trực tiếp đến ổ cắm, sẽ tạo ra một phòng cho 2 người dùng sử dụng và chỉ cần gửi tin nhắn tự do trong đó.

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. 

Nếu không, bạn sẽ cần phải theo dõi từng kết nối ổ cắm riêng của khách hàng và khi bạn muốn trò chuyện, bạn sẽ tìm kiếm kết nối ổ cắm đó và phát ra riêng. Tôi đã nói ở trên. Phòng có lẽ dễ dàng hơn.

+0

Hi.So tôi chỉ cần thêm dòng đó đến chỗ máy chủ? Và có bất cứ điều gì khác nhìn tốt? –

+1

@ HoàngPhúcVũ Tôi không chắc chắn 100% những gì bạn đang cố gắng thực hiện trong mã của bạn, bạn nói rằng bạn muốn gửi đến một kết nối socket cụ thể, nhưng tôi thấy không có nỗ lực tìm kiếm một id socket và gửi cho họ. – Datsik

+0

Điều tôi muốn gửi là tin nhắn riêng giữa 2 người dùng. Bạn có gợi ý gì về trường hợp này không. Xin giúp đỡ –

0

Socket.io Version 2.0.3+

gửi một thông điệp tới một ổ cắm cụ thể

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"); 
    } 
Các vấn đề liên quan