是否可以使用socket.io强制所有客户端更新?我尝试过以下方法,但在新客户端连接时似乎没有更新其他客户端:
我正在尝试向所有客户端发送一条消息,其中包含当前已连接用户的数量,它正确地发送了一定数量的用户....但是,在页面已经过去之前,客户端本身似乎没有更新刷新。我希望这是实时的。
var clients = 0;
io.sockets.on('connection', function (socket) {
++clients;
socket.emit('users_count', clients);
socket.on('disconnect', function () {
--clients;
});
});
var socket = io.connect('http://localhost');
socket.on('connect', function(){
socket.on('users_count', function(data){
$('#client_count').text(data);
console.log("Connection");
});
});
答案 0 :(得分:174)
实际上并没有向其他客户端发送更新,而只是向刚刚连接的客户端发送更新(这就是您第一次加载时看到更新的原因)
// socket is the *current* socket of the client that just connected
socket.emit('users_count', clients);
相反,您要发送到所有套接字
io.sockets.emit('users_count', clients);
或者,您可以使用广播功能,该功能会向除了启动它的套接字以外的所有人发送消息:
socket.broadcast.emit('users_count', clients);
答案 1 :(得分:13)
我发现使用 socket.broadcast.emit() 只会广播到当前的“连接”,但 io.sockets.emit 将向所有客户广播。 这里服务器正在监听“两个连接”,它们完全是2个插槽命名空间
io.of('/namespace').on('connection', function(){
socket.broadcast.emit("hello");
});
io.of('/other namespace').on('connection',function(){/*...*/});
我尝试在一个命名空间中使用 io.sockets.emit() ,但是客户端在另一个命名空间中收到了它。但是 socket.broadcast.emit() 只会广播当前的套接字命名空间。
答案 2 :(得分:3)
从socket.io 0.9版开始,“emit”不再适用于我,而且我一直在使用“发送”
这就是我正在做的事情:
服务器端:
var num_of_clients = io.sockets.clients().length;
io.sockets.send(num_of_clients);
客户端:
ws = io.connect...
ws.on('message', function(data)
{
var sampleAttributes = fullData.split(',');
if (sampleAttributes[0]=="NumberOfClients")
{
console.log("number of connected clients = "+sampleAttributes[1]);
}
});
答案 3 :(得分:0)
You can follow this example for implementing your scenario.
You can let all of clients to join a common room for sending some updates.
Every socket can join room like this:
currentSocket.join("client-presence") //can be any name for room
Then you can have clients key in you sockets which contains multiple client's data(id and status) and if one client's status changes you can receive change event on socket like this:
socket.on('STATUS_CHANGE',emitClientsPresence(io,namespace,currentSocket); //event name should be same on client & server side for catching and emiting
and now you want all other clients to get updated, so you can do something like this:
emitClientsPresence => (io,namespace,currentSocket) {
io.of(namespace)
.to(client-presence)
.emit('STATUS_CHANGE', { id: "client 1", status: "changed status" });
}
This will emit STATUS_CHANGE event to all sockets that have joined "client-presence" room and then you can catch same event on client side and update other client's status.
答案 4 :(得分:0)
根据此Broadcasting。 使用 nodejs 服务器,你可以使用这个:
io.emit('event_id', {your_property: 'your_property_field'});
一定要初始化websocket,例如:
var express = require('express');
var http = require('http');
var app = express();
var server = http.Server(app);
var io = require('socket.io')(server);
app.get('/', function (req, res) {
res.send('Hello World!');
io.emit('event_hello', {message: 'Hello Socket'});
});
server.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
在这种情况下,当用户到达您的服务器时,将使用 json 对象 {message: 'Hello Socket'} 向所有 web-socket 客户端广播“event_hello”。