Подтвердить что ты не робот

Node.js + socket.io передается от сервера, а не от конкретного клиента?

Я создаю простую систему, такую ​​как лента новостей в реальном времени, используя node.js + socket.io.

Поскольку это система "только для чтения", клиенты подключаются и получают данные, но клиенты фактически не отправляют какие-либо данные самостоятельно. Сервер генерирует сообщения, которые должны быть отправлены всем клиентам, ни один клиент не генерирует никаких сообщений; но мне нужно транслировать.

Документация для рассылки socket.io (конец страницы) говорит

Для трансляции просто добавьте флаг broadcast в вызовы методов emit и send. Вещание означает отправку сообщения всем остальным, кроме сокета, который его запускает.

Таким образом, я в настоящее время захватываю последнего клиента для подключения, в переменную, затем emit() к этому сокету и broadcast.emit() к этому сокету, так что этот новый клиент получает новые данные и все остальные клиенты. Но похоже, что роль клиента здесь не что иное, как обходное решение для того, что, как я думал, уже поддерживается socket.io.

Есть ли способ отправить данные всем клиентам на основе события, инициированного сервером?

Мой текущий подход примерно:

var socket;

io.sockets.on("connection", function (s) {
  socket = s;
});

/* bunch of real logic, yadda yadda ... */

myServerSideNewsFeed.onNewEntry(function (msg) {
  socket.emit("msg", { "msg" : msg });
  socket.broadcast.emit("msg", { "msg" : msg });
});

В основном события, которые заставляют данные запрашивать отправку на клиент, являются серверными, а не клиентскими.

4b9b3361

Ответ 1

Почему бы просто не сделать так, как показано ниже?

io.sockets.emit('hello',{msg:'abc'});

Ответ 2

Поскольку вы излучаете события только на стороне сервера, вы должны создать для своего сервера EventEmitter.

var io = require('socket.io').listen(80);
    events = require('events'),
    serverEmitter = new events.EventEmitter();

io.sockets.on('connection', function (socket) {
  // here you handle what happens on the 'newFeed' event
  // which will be triggered by the server later on
  serverEmitter.on('newFeed', function (data) {
    // this message will be sent to all connected users
    socket.emit(data);
  });
});

// sometime in the future the server will emit one or more newFeed events
serverEmitter.emit('newFeed', data);

Примечание. newFeed - это просто пример события, вы можете иметь столько событий, сколько захотите.

Внимание!

Вышеприведенное решение лучше также потому, что в будущем вам может понадобиться излучать определенные сообщения только некоторым клиентам, а не всем (при этом нужны условия). Для чего-то более простого (просто выпустите сообщение всем клиентам, независимо от того, что), io.sockets.broadcast.emit() действительно лучше подходит.