node.js 在 Socket IO 中向特定客户端发送消息

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35680565/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 19:59:03  来源:igfitidea点击:

Sending message to specific client in Socket IO

node.jssockets

提问by Datsik

I'm using Socket IO v1.4.5 and have tried 3 different ways below but dont have any result.

我正在使用 Socket IO v1.4.5 并尝试了以下 3 种不同的方法,但没有任何结果。

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

Here is my server side

这是我的服务器端

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

Any help would be great.Thanks for help.Kind Regard

任何帮助都会很棒。感谢您的帮助。亲切的问候

回答by Datsik

To send a message to a specific client you need to do it like so:

要向特定客户端发送消息,您需要这样做:

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

Here is a nice little cheat sheet for sockets:

这是一个不错的套接字小备忘单:

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

Credit to https://stackoverflow.com/a/10099325

归功于https://stackoverflow.com/a/10099325



The easiest way rather than sending directly to the socket, would be creating a room for the 2 users to use and just send messages freely in there.

最简单的方法不是直接发送到套接字,而是创建一个供 2 个用户使用的房间,然后在那里自由发送消息。

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.

Otherwise, you're going to need to keep track of each individual clients socket connection, and when you want to chat you'll have to look up that sockets connection and emit specifically to that one using the function I said above. Rooms are probably easier.

否则,您将需要跟踪每个单独的客户端套接字连接,并且当您想聊天时,您必须查找该套接字连接并使用我上面提到的函数专门向该套接字发送。房间可能更容易。

回答by partikles

Socket.io Version 2.0.3+

Socket.io 版本 2.0.3+

Sending a message to a specific socket

向特定套接字发送消息

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

回答by Muhammad Awais

Simply do this

只需这样做

io.socket.in('room').emit("send message to everyone", data);