首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用socket.io和node.js向特定客户端发送消息

使用socket.io和node.js向特定客户端发送消息
EN

Stack Overflow用户
提问于 2011-01-10 21:29:46
回答 10查看 286K关注 0票数 220

我正在使用socket.io和node.js,到目前为止,它看起来相当不错,但我不知道如何从服务器向特定的客户端发送消息,就像这样:

client.send(message, receiverSessionId)

但是.send().broadcast()方法似乎都不能满足我的需求。

我发现一种可能的解决方案是,.broadcast()方法接受SessionIds数组作为第二个参数,不向其发送消息,因此我可以传递一个数组,其中包含当时连接到服务器的所有SessionIds (除了我希望发送消息的那个),但我觉得肯定有更好的解决方案。

有什么想法吗?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-01-10 22:14:13

好吧,你必须抓住客户(惊喜),你可以选择简单的方式:

var io = io.listen(server);
io.clients[sessionID].send()

这可能会被破坏,我对此表示怀疑,但io.clients总是有可能被更改,因此请谨慎使用上面的代码

或者您自己跟踪客户端,因此您可以将它们添加到connection侦听器中您自己的clients对象中,并在disconnect侦听器中删除它们。

我将使用后一种方法,因为根据应用程序的不同,您可能希望在客户端上有更多的状态,这样像clients[id] = {conn: clientConnect, data: {...}}这样的代码就可以完成这项工作。

票数 97
EN

Stack Overflow用户

发布于 2012-03-22 16:21:36

Ivo Wetzel的答案似乎在Socket.io 0.9中不再有效。

简而言之,您现在必须保存socket.id并使用io.sockets.socket(savedSocketId).emit(...)向其发送消息。

这就是我是如何在集群Node.js服务器中工作的:

首先,您需要将Redis store设置为store,以便消息可以跨进程传递:

var express = require("express");
var redis = require("redis");
var sio = require("socket.io");

var client = redis.createClient()
var app = express.createServer();
var io = sio.listen(app);

io.set("store", new sio.RedisStore);


// In this example we have one master client socket 
// that receives messages from others.

io.sockets.on('connection', function(socket) {

  // Promote this socket as master
  socket.on("I'm the master", function() {

    // Save the socket id to Redis so that all processes can access it.
    client.set("mastersocket", socket.id, function(err) {
      if (err) throw err;
      console.log("Master socket is now" + socket.id);
    });
  });

  socket.on("message to master", function(msg) {

    // Fetch the socket id from Redis
    client.get("mastersocket", function(err, socketId) {
      if (err) throw err;
      io.sockets.socket(socketId).emit(msg);
    });
  });

});

我在这里省略了集群代码,因为它使代码变得更加杂乱,但是添加起来很简单。只需将所有内容添加到worker代码中。更多文档请点击此处http://nodejs.org/api/cluster.html

票数 192
EN

Stack Overflow用户

发布于 2014-12-03 19:28:38

每个套接字都使用一个套接字id作为名称加入一个房间,因此您可以只

io.to(socket#id).emit('hey')

文档:http://socket.io/docs/rooms-and-namespaces/#default-room

干杯

票数 124
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4647348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档