Чтобы отправить сообщение сокета во все подключенные сокеты, вы можете просто вызвать io.sockets.emit
вместо socket.emit. Существует несколько способов отправки сообщений с использованием socket.io, которые я опишу ниже.
// Send the message to all connected clients
io.sockets.emit('message', data);
// Send the message to only this client
socket.emit('message', data);
// Send the messages to all clients, except this one.
socket.broadcast.emit('message', data);
Существует также концепция комнат, которые вы можете использовать для сегментации своих клиентов.
// Have a client join a room.
socket.join('room')
// Send a message to all users in a particular room
io.sockets.in('room').emit('message', data);
Все, что охватывает как отправлять сообщения, но теперь ясно, что вы спрашиваете о том, как получить доступ к сокет и/или Io объекты внутри отдельного файла. Один из вариантов позволяет передать эти зависимости указанному файлу. Ваша строка запроса будет выглядеть примерно так.
var routes = require('./routes')(io);
Где Ио объект socket.io создан из .listen. Чтобы обработать это в файле маршрута, вам придется изменить способ определения вашего экспорта.
module.exports = function(io) {
return {
index: function(req, res) {
io.sockets.emit('hello', 'world');
res.send('hello world');
}
};
}
Более чистая реализация приведет к тому, что ваши маршруты выведут события, к которым может привязать код сокета. Следующее непроверено, но должно быть очень близко.
var util = require("util"),
events = require("events");
function MyRoute() {
events.EventEmitter.call(this);
}
util.inherits(MyRoute, events.EventEmitter);
MyRoute.prototype.index = function(req, res) {
this.emit('index');
res.send('hello world');
}
module.exports = new MyRoute();
А затем в файле app.js, когда вы связываете экспресс-маршруты и socket.io.
app.get('/send', routes.index);
routes.on('index', function() {
io.sockets.emit('hello', 'world');
});
Существует много других способов достижения этого, но лучший из них зависит от того, что вы пытаетесь сделать. Как я уже упоминал ранее, вызывать трансляцию для всех будет гораздо проще, чем трансляция для конкретного пользователя.
Вы пытаетесь испустить все подключенные сокеты или к определенному гнезду? –
пока я просто соглашусь на всех, я так новичок во всем узле. –