Как быть уверенным, что сообщение через socket.io было получено клиенту?

Как проверить, что сообщение, отправленное с помощью библиотеки socket.io, было получено клиенту. Есть ли специальный метод для него в socket.io?

Спасибо за ваши ответы!

Ответы

Ответ 1

Вы должны использовать параметр обратного вызова при определении обработчика событий.

Типичная реализация будет следующей:

Клиентская сторона

var socket = io.connect('http://localhost');
socket.emit('set', 'is_it_ok', function (response) {
    console.log(response);
});

Серверная сторона

io.sockets.on('connection', function (socket) {
    socket.on('set', function (status, callback) {
        console.log(status);
        callback('ok');
    });
});

Теперь проверьте консоль на стороне сервера. Он должен отображать 'is_it_ok'. Следующая консоль проверки на стороне клиента. Он должен отображать "ok". Это сообщение подтверждения.

Update

Соединение socket.io является по существу постоянным. Следующие встроенные функции позволяют вам действовать в зависимости от состояния соединения.

socket.on('disconnect', function() {} ); // wait for reconnect
socket.on('reconnect', function() {} ); // connection restored  
socket.on('reconnecting', function(nextRetry) {} ); //trying to reconnect
socket.on('reconnect_failed', function() { console.log("Reconnect failed"); });

Использование опции обратного вызова, показанной выше, представляет собой комбинацию следующих двух шагов:

socket.emit('callback', 'ok') // happens immediately

и на стороне клиента

socket.on('callback', function(data) {
    console.log(data);
});

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

Ответ 2

Вы можете использовать подтверждения socket.io.

Цитата из документации socket.io:

Иногда вам может потребоваться обратный вызов, когда клиент подтвердит прием сообщения.

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

На стороне клиента просто выпустите событие с вашими данными, функция будет вызываться всякий раз, когда сервер отвечает на ваше событие:

client.emit("someEvent", {property:value}, function (data) {
  if (data.error) 
    console.log('Something went wrong on the server');

  if (data.ok)
    console.log('Event was processed successfully');
});

На стороне сервера вы вызываетесь с данными и обработчиком обратного вызова для отправки ответа:

socket.on('someEvent', function (data, callback) {

  // do some work with the data

  if (err) {
    callback({error:'someErrorCode', msg:'Some message'});
    return;
  }

  callback({ok:true});
});

Ответ 3

Когда вы добавляете функцию в качестве последнего параметра вызовов методов .send() или .emit(), эта функция вызывается, когда другая сторона получает сообщение.

socket.send('hi', function() {
    // if we are here, our salutation has been received by the other party.
});