有个表 a
-------------
| uid | sum |
-------------
| 1 | 20 |
-------------
| 2 | 36 |
-------------
| 3 | 88 |
-------------
有操作(加减乘除)后值可能变为
-------------
| uid | sum |
-------------
| 1 | 15 |
-------------
| 2 | 40 |
-------------
| 3 | 80 |
-------------
所有人都可以操作(加减乘除),但只推送给表中的各个用户各自不同的值。
推送给自己、推送给其他人、推送所有人 socket.io 都有实现了,也都比较容易,就是这个没想明白。
在某个页面(用户中心)实时显示各个用户 sum 值,有操作后如何推送各自的值到页面?
-----------更新------------------------
用户在页面(用户中心)只能看到自己的 sum 值
要拿到对应的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 表相关数据,做出数组推送到其他所有客户端,客户端在比对相应用户才显示。