7 Stimmen

Socket.io-Pakete gehen zwischen Unterbrechungen und Neuverbindungen verloren

Ich verwende socket.io, um ein Smartphone (in einem Webframe) mit einem Server zu verbinden und ein paar Nachrichten auszutauschen (ein paar kurze Zeichen pro Minute, nichts Großes). Da Smartphones oft eine instabile Verbindung haben, ist socket.io gezwungen, von Zeit zu Zeit erneut zu verbinden. Dies geschieht automatisch und die Nachrichten, die ich senden möchte, nachdem festgestellt wurde, dass die Verbindung derzeit nicht verfügbar ist, werden zwischengespeichert und als Bundle gesendet, sobald die Verbindung wieder hergestellt ist. Im Grunde läuft also alles gut mit socket.io.

Aber wenn ich eine Nachricht sende, kurz bevor socket.io bemerkt, dass die Verbindung weg ist, geht die Nachricht verloren. Sie kann nicht übertragen werden, wird aber auch nicht von socket.io zwischengespeichert. Ich bin zufrieden mit socket.io, aber dieses Problem stört mich, da ich nicht viele Nachrichten sende, aber die, die ich sende, zuverlässig gesendet werden müssen. Während die Verbindung hergestellt ist, werden alle Nachrichten einwandfrei übertragen, daher muss ich das nicht überprüfen. Nur die Sekunde zwischen dem Verlust der Verbindung und dem Erkennen von socket.io ist der kritische Moment, in dem ich Datenverlust habe.

Ich habe darüber nachgedacht, das TCP-Verhalten mit Sequenznummern und Bestätigungen nachzuahmen, aber es fühlt sich ein wenig an wie mit Kanonen auf Spatzen schießen. Also meine Frage: Hat jemand eine leichte Lösung für dieses Problem oder es selbst erlebt? Ich frage nicht einmal explizit nach Code - das kann ich selbst machen - aber ein Konzept oder so etwas, um dieses spezifische Problem loszuwerden, wäre großartig.

Vielen Dank im Voraus!

3voto

Dslayer Punkte 1075

Warum loggst du nicht einfach jede Nachricht in die Datenbank? Und nutze die socket.io-Acknowledge-Option, um es noch besser zu machen.

von http://socket.io/#how-to-use SERVER

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.on('ferret', function (name, fn) {
    fn('woot');
  });
});

CLIENT

  var socket = io.connect(); // TIP: .connect mit keinem Argument führt zur automatischen Erkennung
  socket.on('connect', function () { // TIP: Du kannst das Hören auf `connect` vermeiden und direkt auf Ereignisse hören!
    socket.emit('ferret', 'tobi', function (data) {
      console.log(data); // data wird 'woot' sein
    });
  });

0voto

Shane Hudson Punkte 707

Wenn es so wichtig ist, würde ich wahrscheinlich eine naive Version von TCP nachahmen. Speichern Sie einfach einen Puffer auf der Clientseite und lassen Sie den Server die Nachricht bestätigen, oder senden Sie sie erneut aus dem Puffer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X