我正在使用socket.io和node.js,到目前为止,它看起来相当不错,但我不知道如何从服务器向特定的客户端发送消息,就像这样:
client.send(message, receiverSessionId)
但是.send()
和.broadcast()
方法似乎都不能满足我的需求。
我发现一种可能的解决方案是,.broadcast()
方法接受SessionIds数组作为第二个参数,不向其发送消息,因此我可以传递一个数组,其中包含当时连接到服务器的所有SessionIds (除了我希望发送消息的那个),但我觉得肯定有更好的解决方案。
有什么想法吗?
发布于 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: {...}}
这样的代码就可以完成这项工作。
发布于 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
发布于 2014-12-03 19:28:38
每个套接字都使用一个套接字id作为名称加入一个房间,因此您可以只
io.to(socket#id).emit('hey')
文档:http://socket.io/docs/rooms-and-namespaces/#default-room
干杯
https://stackoverflow.com/questions/4647348
复制相似问题