我正在使用socket.io和node.js,直到现在看起来还不错,但我不知道如何从服务器向特定客户端发送消息,如下所示:
client.send(message, receiverSessionId)
Run Code Online (Sandbox Code Playgroud)
但是这些.send()和.broadcast()方法似乎都不能满足我的需要.
我发现作为一种可能的解决方案是,该.broadcast()方法接受一个不发送消息的SessionIds数组作为第二个参数,因此我可以将当前连接的所有SessionId的数组传递给服务器,除了一个我希望发送消息,但我觉得必须有更好的解决方案.
有任何想法吗?
如何使用node.js和socket.io向共享conversation_id的私人聊天中的所有用户发送消息?
var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);
conversations = {};
app.get('/', function(req, res) {
res.sendfile('/');
});
io.sockets.on('connection', function (socket) {
socket.on('send message', function (data) {
var conversation_id = data.conversation_id;
if (conversation_id in conversations) {
console.log (conversation_id + ' is already in the conversations object');
// emit the message [data.message] to all connected users in the conversation
} else {
socket.conversation_id = data;
conversations[socket.conversation_id] = socket;
conversations[conversation_id] = data.conversation_id;
console.log ('adding ' + conversation_id …Run Code Online (Sandbox Code Playgroud) 我的聊天应用程序遇到问题,我需要能够向特定用户发送私人消息,我能够选择该特定用户但由于某种原因无法弄清楚如何发送私人消息.
您可以在下面找到我服务器的代码,请帮助:
var express = require('express');
var app = express();
var PORT = process.env.PORT || 8000;
var http = require('http').Server(app); // this is a node server that uses express as the boiler plate
var io = require('socket.io')(http); // socket! pass our server as a parameter to it
// use express static to expose a folder
app.use(express.static(__dirname + '/public'));
var users = [],
connections = [];
var onlineClients = {};
// Register events on socket connection
io.on('connection', function(socket){
connections.push(socket);
// console.log("connected …Run Code Online (Sandbox Code Playgroud)我正在尝试开发一个支持后端长任务的网络应用程序。我在我的服务器上使用flask-socketio包和芹菜。我的工作流程如下:
我查看了 @Miguels 对39423646/flask-socketio-emit-to-specific-user的回答,它为每个用户创建一个单独的房间,然后在该房间上广播消息。但我想问是否有其他更简单的方法来做到这一点,因为它似乎效率低下或强制的方式来做到这一点。
我还遇到了nodejs解决方案(how-to-send-a-message-to-a-preferred-client-with-socket-io),我觉得这是实现这一目标的更自然的方式。python-socketio 中也有类似的解决方案吗?
更新:经过更多搜索后,我在 github gist 上发现了以下解决方案。据此 -- ** flash-socketIO 已经将所有客户端放在request.sid** 指定的单独房间中。
我仍然希望讨论其他方法来做到这一点。具体来说,如果网站流量相当高,是否会导致房间过多?
更新(2):我当前的(工作)服务器代码使用 rooms。这是从flask-SocketIO celery示例借用并修改的
@celery.task(bind=True)
def long_task(self, userid, url):
# LONG TASK
time.sleep(10)
# meta = some result
post(url, json=meta)
# It seems i can't directly emit from celery function so I mimic a post request and emit from that …Run Code Online (Sandbox Code Playgroud)