socket.io 如何推送不同人不同值?
发布于 2 个月前 作者 liuxufei 851 次浏览 来自 问答

有个表 a

-------------
| uid | sum |
-------------
| 1   | 20  |
-------------
| 2   | 36  |
-------------
| 3   | 88  |
-------------

有操作(加减乘除)后值可能变为

-------------
| uid | sum |
-------------
| 1   | 15  |
-------------
| 2   | 40  |
-------------
| 3   | 80  |
-------------

所有人都可以操作(加减乘除),但只推送给表中的各个用户各自不同的值。

推送给自己、推送给其他人、推送所有人 socket.io 都有实现了,也都比较容易,就是这个没想明白。

在某个页面(用户中心)实时显示各个用户 sum 值,有操作后如何推送各自的值到页面?

-----------更新------------------------

用户在页面(用户中心)只能看到自己的 sum 值

11 回复

要拿到对应的socket然后write 不能广播

跟聊天一样吧,当这个值改变后,写回一个消息,返给服务器,服务器通知所有能看到该人的信息,更新信息。 socket.io 不是只能做 聊天, 你把它想成 socket,socket能做的,它都能做。

@htoooth 推送到服务器上做值的更改很简单,就是如何推送给表中的用户不同的值这个不懂

@liuxufei 我能想到的是广播。假设所有的用户在同一个房间中,每个人修改自己的值,然后推到服务器,服务器把修改后的值写入服务器后,发个把修改后的值推到每个客户端,然后就在客户端更新。

@htoooth 我的问题不是你说的这样,是所有人都可以更改,一次的更改是表中的所有 sum 值都会变,然后要推送给表中对应的用户。

a, b, c三个客户端, 任意一个都能发起操作, 无论谁操作之后, a, b, c的数值都会发生改变, 但是每个客户端只能看到自己的数值改变。 是这个意思?

@wwj559 嗯,不只三个用户可以发起操作,只是改变的是这个表中的用户(不一定三个)的 sum 值。

在监听客户端connection的时候把客户端信息给到socket,这样就能在监听消息时从sockets集合中过滤出需要推送的客户端了,下面的代码可以参考下

//import express var app = require(‘express’)(); var http = require(‘http’).Server(app); //import socket.io var io = require(‘socket.io’)(http);

//启动客户端连接监听 io.on(‘connection’, function (socket) { socket.on(“clientInfo”, function (result) { socket.clientInfo = result.clientInfo; socket.emit(“getSend”, { msg: “connection ok” }); });

socket.on('sendMsg', function (data) {
    io.sockets.sockets.forEach(function (s) {
        //找到对应的用户客户端
        if (data.users != null && data.users.length > 0) {
            var users = data.users.split(",");
            users.forEach(function (userid) {
                if (s.id != socket.id && s.clientInfo != null && s.clientInfo.UserID == parseInt(userid)) {
                    s.emit("getSend", { msg: "您有一条新消息!" });
                }
                else {
                }
            });
        }
    });
});

socket.on('disconnect', function () {
    console.info(socket.id + ' disconnect');
});

});

@zhuwenjun 非常感谢,这个应该能解决我的问题,我试过再说!

我想的解决方案是使用socket群发一条更新消息,再由客户端拉最新的sum值更新显示

@baka397 不是。是任何人都可以操作提交到服务器,服务器在推送到 a 表中的用户对应的客户端。 我还没有做到这样的解决方式,好糗。我会继续寻找解决的。

目前我是这样做的: 操作提交到服务器,我查询出所有 a 表相关数据,做出数组推送到其他所有客户端,客户端在比对相应用户才显示。

回到顶部