Jak upewnić się, że wiadomość za pośrednictwem socket.io został przyjęty do klienta?

Jak sprawdzić wiadomość wysłaną za pomocą socket.io biblioteka została odebrana klientowi. Czy istnieje specjalna metoda na to w socket.io?

Dzięki za odpowiedzi!

Author: Bart, 2012-07-08

3 answers

Należy użyć parametru callback podczas definiowania obsługi zdarzenia.

Typowa implementacja wygląda następująco:

Strona klienta

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

Strona serwera

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

Teraz sprawdź konsolę po stronie serwera. Powinien wyświetlać 'is_it_ok'. Następnie sprawdź konsolę po stronie klienta. Powinien wyświetlać "ok". To wiadomość potwierdzająca.

Update

A socket.io połączenie jest zasadniczo trwałe. Następujące wbudowane funkcje pozwalają na działanie oparte na stanie połączenia.

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"); });

Użycie opcji callback pokazanej powyżej jest efektywnie kombinacją następujących dwóch kroków:

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

I po stronie klienta

socket.on('callback', function(data) {
    console.log(data);
});
Więc nie musisz używać timera. Wywołanie zwrotne jest uruchamiane natychmiast, chyba że połączenie ma jeden z następujących stanów - "disconnect", "reconnecting", "reconnect_failed".
 24
Author: almypal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-11 20:52:46

Możesz użyć socket.io podziękowania.

Cytat z socket.io dokumentacja:

Czasami możesz chcieć uzyskać oddzwonienie, gdy klient potwierdzi odbiór wiadomości.

Aby to zrobić, wystarczy przekazać funkcję jako ostatni parametr .send lub .emit. Co więcej, gdy używasz .emit, potwierdzenie jest zrobione przez Ciebie, co oznacza, że możesz również przekazywać dane.

Po stronie klienta po prostu emituj zdarzenie ze swoimi danymi, funkcja będzie wywoływana za każdym razem, gdy serwer odpowie na twoje Zdarzenie:

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');
});

Po stronie serwera dostajesz wywołanie z danymi i uchwytem zwrotnym, aby wysłać odpowiedź:

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

  // do some work with the data

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

  callback({ok:true});
});
 5
Author: Mirko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-25 18:57:20

Gdy dodasz funkcję jako ostatni parametr wywołania metody .send() lub .emit(), Funkcja ta zostanie wywołana, gdy druga strona otrzyma wiadomość.

socket.send('hi', function() {
    // if we are here, our salutation has been received by the other party.
});
 1
Author: hasanyasin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-08 11:49:42