[javascript] Socket.io를 사용하여 모든 클라이언트를 업데이트 하시겠습니까?

모든 클라이언트가 socket.io를 사용하여 업데이트하도록 강제 할 수 있습니까? 다음을 시도했지만 새 클라이언트가 연결될 때 다른 클라이언트를 업데이트하지 않는 것 같습니다.

서버 측 JavaScript :

현재 연결된 사용자 수를 포함하는 모든 클라이언트에 메시지를 보내려고합니다. 사용자 수를 올바르게 보냅니다 …. 그러나 클라이언트 자체는 페이지를 새로 고칠 때까지 업데이트되지 않는 것 같습니다. 나는 이것이 실시간으로 일어나기를 바랍니다.

var clients = 0;
io.sockets.on('connection', function (socket) {
  ++clients;
  socket.emit('users_count', clients);
  socket.on('disconnect', function () {
    --clients;
  });
});

클라이언트 측 JavaScript :

var socket = io.connect('http://localhost');

socket.on('connect', function(){
  socket.on('users_count', function(data){
    $('#client_count').text(data);
    console.log("Connection");
  });
});



답변

실제로 다른 클라이언트에 업데이트를 보내는 것이 아니라 방금 연결된 클라이언트에 전송하는 것뿐입니다 (이것이 처음로드 할 때 업데이트를 보는 이유입니다).

// socket is the *current* socket of the client that just connected
socket.emit('users_count', clients);

대신 모든 소켓 에 방출하고 싶습니다.

io.sockets.emit('users_count', clients);

또는이를 시작하는 소켓을 제외한 모든 사람에게 메시지를 보내는 broadcast 함수를 사용할 수 있습니다.

socket.broadcast.emit('users_count', clients);


답변

socket.broadcast.emit () 을 사용 하면 현재 “연결”에만 브로드 캐스트되지만 io.sockets.emit 은 모든 클라이언트에 브로드 캐스트된다는 것을 알았 습니다. 여기서 서버는 정확히 2 개의 소켓 네임 스페이스 인 “2 개의 연결”을 수신 합니다.

io.of('/namespace').on('connection', function(){
    socket.broadcast.emit("hello");
});
io.of('/other namespace').on('connection',function(){/*...*/});

한 네임 스페이스에서 io.sockets.emit () 을 사용하려고 했지만 다른 네임 스페이스의 클라이언트가 수신했습니다. 그러나 socket.broadcast.emit () 은 현재 소켓 네임 스페이스를 브로드 캐스트합니다.


답변

socket.io 버전 0.9부터 “emit”이 더 이상 작동하지 않았고 “send”를 사용하고 있습니다.

내가하는 일은 다음과 같습니다.

서버 측 :

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]);
        }
});


답변

이 예제를 따라 시나리오를 구현할 수 있습니다.

모든 클라이언트가 일부 업데이트를 보내기 위해 휴게실에 참여하도록 할 수 있습니다. 모든 소켓은 다음과 같이 방에 참여할 수 있습니다.

currentSocket.join("client-presence") //can be any name for room

그런 다음 여러 클라이언트의 데이터 (ID 및 상태)를 포함하는 소켓에 클라이언트 키를 가질 수 있으며 한 클라이언트의 상태가 변경되면 다음과 같이 소켓에서 변경 이벤트를받을 수 있습니다.

socket.on('STATUS_CHANGE',emitClientsPresence(io,namespace,currentSocket); //event name should be same on client & server side for catching and emiting

이제 다른 모든 클라이언트가 업데이트되기를 원하므로 다음과 같이 할 수 있습니다.

emitClientsPresence => (io,namespace,currentSocket) {
  io.of(namespace)
        .to(client-presence)
        .emit('STATUS_CHANGE', { id: "client 1", status: "changed status" });
}

이렇게하면 “client-presence”룸에 참여한 모든 소켓에 STATUS_CHANGE 이벤트가 발생하고 클라이언트 측에서 동일한 이벤트를 포착하고 다른 클라이언트의 상태를 업데이트 할 수 있습니다.


답변

방송 에 따르면 . 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’}을 사용하여 모든 웹 소켓 클라이언트에 “event_hello”가 브로드 캐스트됩니다.


답변