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

Отправка сообщения конкретному клиенту с помощью 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);
    });
});

но клиент ничего не делает. Я пробовал почти все. Может кто-нибудь сказать мне, что я делаю неправильно, пожалуйста!: (

4b9b3361

Ответ 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);