Отправка сообщения конкретному клиенту с помощью socket.io и пустой очереди сообщений
Я с ума сойду с socket.io!
Документация настолько плохая, что это просто не так.
Я хочу отправить отзыв конкретному клиенту через socket.io
Моя серверная сторона выглядит следующим образом:
app.get('/upload', requiresLogin, function(request, response) {
response.render('upload/index.jade');
io.sockets.on('connection', function (socket) {
console.log('SOCKET ID ' + socket.id);
io.sockets.socket(socket.id).emit('new', 'hello');
});
});
и клиентская сторона выглядит следующим образом:
$(document).ready(function() {
var socket = io.connect('http://localhost:80/socket.io/socket.io.js');
socket.on('new', function (data) {
console.log(socket.id);
console.log(data);
//$('#state').html(data.status);
});
});
но клиент ничего не делает. Я пробовал почти все. Может кто-нибудь сказать мне, что я делаю неправильно, пожалуйста!: (
Ответы
Ответ 1
чтобы отправить сообщение конкретному клиенту, сохраните все, кто подключается к серверу в объекте.
var socketio = require('socket.io');
var clients = {};
var io = socketio.listen(app);
io.sockets.on('connection', function (socket) {
clients[socket.id] = socket;
});
то вы можете позже сделать что-то вроде этого:
var socket = clients[sId];
socket.emit('show', {});
Ответ 2
Несколько способов отправить отзыв конкретному клиенту через socket.io включают:
-
Как указано pkyeck, сохраните всех клиентов в Object, чтобы вы могли отправлять эти конкретные клиенты позже в своих обработчиках маршрутов, например:
var sessionsConnections = {};
sio.on('connection', function (socket) {
// do all the session stuff
sessionsConnections[socket.handshake.sessionID] = socket;
});
-
или, используя socket.io, встроенный в поддержку комнат - подписывайте каждого клиента в комнату при подключении и отправляйте через эту комнату в обработчиках маршрутов, например:
sio.on('connection', function (socket) {
// do all the session stuff
socket.join(socket.handshake.sessionID);
// socket.io will leave the room upon disconnect
});
app.get('/', function (req, res) {
sio.sockets.in(req.sessionID).send('Man, good to see you back!');
});
Квитирование:
http://www.danielbaulig.de/socket-ioexpress/#comment-1158
Обратите внимание, что оба этих примера решения предполагают, что socket.io и express настроены на использование одного и того же хранилища сеансов и, следовательно, ссылаются на одни и те же объекты сеанса. Для получения более подробной информации см. Ссылки выше и ниже:
https://github.com/LearnBoost/socket.io/wiki/Authorizing
Ответ 3
2 вещи
1) Вы действительно должны разместить io.sockets.on(..)
вне своего маршрута app/update
, чтобы не добавлять несколько клиентов для клиентов.
2) io.sockets.socket(id); не следует использовать, оно должно быть socket.emit('new', 'hello')
Ответ 4
В socket.io 1.0, так оно и будет работать. Он может работать для более низких версий, но я не могу этого гарантировать.
socket.to(socket_id_here).emit('new', 'hello');
Это работает, потому что socket.io автоматически добавляет сокет в комнату с идентификатором сокета при подключении.
Кроме того, если вы планируете обновить до версии 1.0, в api внесено много изменений, поэтому вам иногда придется изменить код, чтобы он работал в 1.0.
Ответ 5
Правильный способ сделать это в Socket.io 1.0+:
io.to(users_socket_id).emit('new', 'hello');
Вы также можете заменить имя комнаты для 'users_socket_id', чтобы испустить в определенную ячейку socket.io.
Ответ 6
Прежде всего, вы не можете использовать socket.id
на стороне клиента.
И затем измените строку
var socket = io.connect('http://localhost:80/socket.io/socket.io.js');
к
var socket = io.connect('http://localhost:80/');
Ответ 7
Я считаю, что io.sockets.socket был удален и был проблемой в Socket.IO(https://github.com/socketio/socket.io/issues/1618).
Вы можете использовать io.sockets.connected [socket.id] и сохранить socket.id для ссылки с пользователем через имя пользователя:
var usernames = {};
usernames[username] = socket.id;
// Sending the message
io.sockets.connected[usernames[username]].emit(...);
Я не вижу его нигде в документации, поэтому я вижу, как это не было получено. Кроме того, если у вас нет ссылок через имена пользователей, вы можете попробовать:
users[socket.id] = socket.id;
чтобы дублировать ключ и значение для легкого доступа.
Возможно, есть и другой способ использования io.clients, как описано ниже, но я не использовал этот метод.
ДРУГОЕ РЕШЕНИЕ: Отправить сообщение конкретному клиенту с socket.io и node.js
Ответ 8
Пробовали ли вы использовать?
var socket = io.connect('http://localhost:80/');
Ответ 9
Я устал от последней версии node и socket.io ниже я собираюсь отправить полный код
<ul id="messages"></ul>
<form action="">
<input id="id1" /><button>Send</button>
</form>
<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
var io = io.connect();
$('form').submit(function(){
io.emit('drumevent', $('#id1').val());
$('#id1').val('');
return false;
});
io.on('drumevent', function(msg){
console.log(msg);
$('#messages').append($('<li></li>').text(msg.message+' quantity = '+msg.quantity));
});
</script>
серверный код
var usernames = {};io.on('connection', function(socket){usernames["username"] = socket.id;
socket.on('drumevent', function(msg){
var socketId = socket.id;io.to(socketId).emit('drumevent', data);