Socket.io отправить пакет только отправителю
Мне еще предстоит выяснить, как напрямую реагировать только на отправителя, используя socket.io
Я узнал, что io.sockets.emit отправляется всем клиентам, но я не хочу отправлять информацию отправителю.
код:
socket.on('login', function (data) {
db.users.find({username: cc.lowerCase(data.username)}, function(err, users) {
if (users.length > 0) {
users.forEach( function(user) {
console.log(user.length);
if (user.password == data.password) {
io.sockets.emit('login', { username: user.username });
} else {
io.sockets.emit('error', { message: "Wrong username or password!" });
}
});
} else {
io.sockets.emit('error', { message: "Wrong username or password!" });
}
});
});
Ответы
Ответ 1
Когда ваш сервер слушает, вы обычно получаете сокет в событии "connection":
require('socket.io').on('connect', function(socket){
Сокет соединяет 2 точки: клиент и сервер. Когда вы выбрасываете этот сокет, вы выбрасываете этот конкретный клиент.
Пример:
var io = require('socket.io');
io.on('connect', function(socket){
socket.on('A', function(something){
// we just received a message
// let respond to *that* client :
socket.emit('B', somethingElse);
});
});
Будьте осторожны, это два разных вызова:
-
socket.emit
: испускать только один сокет
-
io.sockets.emit
: испускать все сокеты
Ответ 2
Простой пример
Синтаксис запутан в socketio. Кроме того, каждый сокет автоматически подключается к собственной комнате с идентификатором socket.id
(так как частный чат работает в сокетке, они используют комнаты).
Отправить отправителю и никому другому
socket.emit('hello', msg);
Отправить всем, включая отправителя (если отправитель находится в комнате) в комнате "Моя комната"
io.to('my room').emit('hello', msg);
Отправить всем, кроме отправителя (если отправитель находится в комнате) в комнате "Моя комната"
socket.broadcast.to('my room').emit('hello', msg);
Отправить всем в каждой комнате, включая отправителя
io.emit('hello', msg); // short version
io.sockets.emit('hello', msg);
Отправить только в конкретный сокет (частный чат)
socket.broadcast.to(otherSocket.id).emit('hello', msg);
Ответ 3
поздно, но лучше, чем никогда;)
У меня было что-то вроде этого:
io.on('connection', function(socket){
socket.emit('some event', data);
socket.on('private event', function(message){
this.emit('other private event', message);
}
}
После некоторого тестирования я понял, что "this.emit" внутри закрытого закрытого события отправляется обратно только отправителю. Поэтому я попробовал "this.broadcast.emit", которые отправляют сообщение всем подключенным, кроме отправителя. Я считаю, что это то, что вы хотите от своего кода.