Nodejs сокет пишет для всех соединений - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть сервер сокетов в узле. Когда он восстанавливает новое сообщение, он записывает его в сокет. Но из которого он воскрес, пишет в соответствующий сокет не все соединения.

Server.js

var server = net.createServer(function(sock){

    console.log('new client connected');

    sock.on('data', function(data) {
        console.log('Server received');

        // ** NOT sending to all clients **
        sock.write('broadcasting to others...');

    });

}); 

Client.js

var client = new net.Socket();

client.connect(PORT, HOST, function() {
    console.log('Client connected to: ' + HOST + ':' + PORT);
    // Write a message to the socket as soon as the client is connected, the server will receive it as message from the client 
    client.write('Client is connected!!');

});

client.on('data', function(data) {    
    console.log('Client received: ' + data);
});

Как я могу передать одно клиентское сообщение всем другим клиентам?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Следуя моему предложению использовать Set для отслеживания всех подключенных сокетов, это один из способов реализовать это. Эта реализация поддерживает, что Set по мере того, как соединения приходят и уходят, прослушивая как событие connect, так и событие end.

Эта реализация также поддерживает желаемую функцию для отправки на все подключенные сокеты, КРОМЕ того, который вызвал событие (которое, я думаю, того, чего хотела бы ваша ситуация):

// Set of all currently connected sockets
const connectedSockets = new Set();

// broadcast to all connected sockets except one
connectedSockets.broadcast = function(data, except) {
    for (let sock of this) {
        if (sock !== except) {
            sock.write(data);
        }
    }
}

const server = net.createServer(function(sock){
    console.log('new client connected');
    connectedSockets.add(sock);

    sock.on('end', function() {
        connectedSockets.delete(sock);
    });

    sock.on('data', function(data) {
        console.log('Server received');

        connectedSockets.broadcast(data, sock);
    });

}); 
0 голосов
/ 07 сентября 2018

Я считаю, что вы всегда можете сохранить ссылку на сокет для каждого клиента в массиве, когда они установили соединение с сервером. Для трансляции просто зациклите массив и используйте команду write()

var clients = [];
var server = net.createServer(function(sock){

   console.log('new client connected');
   clients.push(sock);

   sock.on('data', function(data) {
        console.log('Server received');
        for(var i = 0; i < clients.length; i++) clients[i].write('broadcasting..');
   });

});

Или, если у вас есть контроль как на сервере, так и на клиенте, я думаю, что лучше использовать websocket или socket.io, поскольку он предлагает функцию широковещания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...