14 Stimmen

Wie fährt man socket.io / websocket-client richtig herunter?

Ich versuche, einen Test zu erstellen mit LearnBoosts socket.io y el node-websocket-client . Die Kommunikation zwischen dem Client und dem Server funktioniert einwandfrei. Nachdem die Kommunikation abgeschlossen ist, schließe ich sowohl den Client als auch den Server. Dennoch bleibt das Programm hängen und wartet auf einen unbekannten Rückruf. Zwei Fragen:

  1. Worauf wartet das folgende Programm?
  2. Gibt es ein Werkzeug, um ausstehende Rückrufe in Knotenprogrammen zu diagnostizieren?

var connect = require('connect'),
    io = require('socket.io'),
    WebSocket = require('websocket-client').WebSocket;

var port = 7111;

var server = connect.createServer();

var socket = io.listen(server); 
socket.on('connection', function(client) {
  client.send('Welcome!');

  client.on('message', function(message) {
    console.log(message);
  });

  client.on('disconnect', function() {
    console.log('closing');
    server.close();
  });
});

server.listen(port, function() {
  var ws = new WebSocket('ws://localhost:' + port + '/socket.io/websocket');
  ws.onmessage = function(message) {
    console.log(message.data);
  };

  setTimeout(function() {
    ws.send('~m~3~m~Yo!');
    ws.close();
  }, 10);
});

EDIT: Der Variablenname des WebSocket wurde geändert in ws um Verwechslungen zu vermeiden

6voto

Raynos Punkte 162170
var socket = io.listen(server);

Sie haben einen Socket an einem Port erstellt. Sie haben es nie geschlossen.

socket.server.close() schließt Ihren (socket.io) Socket.

Im Zweifelsfall lesen Sie die socket.io github Beispiele

socket.server === server Es ist der Server, den Sie in der Listenanweisung angeben, damit er geschlossen ist. Ich bin nicht sicher, worauf er wartet.

3voto

ppcano Punkte 2771

Nachfolgend eine Möglichkeit, alle Verbindungen abzuschalten und mehrere expresso-Tests auszuführen (mit socket.io und socket.io-client).

Die Lösung ist knifflig und fehlerhaft, funktioniert aber unter 0.8.5. Das Hauptproblem ist in Bezug auf die Bibliothek zur Verwendung von Websockets (node-websocket-client).

Derzeit haben die OS-Mitwirkenden auf socket.io die Websocket-Client . Wir müssen also dasselbe für unser socket.io-client npm-Paket tun, um die finishClose-Methode auf der Socket-Client-Seite verwenden zu können. Socket.io-client verwendet die Websocket-Bibliothek als npm-Paket, also müssen Sie die Datei (websocket.js) finden und sie durch die gleiche auf socket.io ersetzen.

Anschließend können Sie die Methode finishClose verwenden, um sicherzustellen, dass die Verbindungen geschlossen werden und die Tests mit einigen benutzerdefinierten Server-/Client-Socket-Einstellungen korrekt ablaufen.

  var  io = require("socket.io").listen(port);

  io.set('close timeout', .2);
  io.set('client store expiration', .2);

  var client = require("socket.io-client").connect( "http://localhost", { port: port ,  'reconnect': false, 'force new connection': true});

  client.on('connect', function() {

        client.disconnect();

  });

  client.on('disconnect', function() {

      client.socket.transport.websocket.finishClose();
      io.server.close();

  });

  io.server.on('close', function() {

      setTimeout( function() {

        done();

      }, 500);
  });

Ich hoffe, jemand kann helfen.

0voto

Detect Punkte 2049

Das Programm wartet, weil socket.io (Server) immer noch auf eingehende Verbindungen wartet. Ich kenne keine Möglichkeit, das Lauschen zu beenden.

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