Как правильно закрыть shutdown socket.io/websocket-client?

Я пытаюсь создать тест, используя LearnBoost socket.io и node-websocket-client. Общение между клиентом и сервером отлично работает. После завершения связи я закрываю как клиент, так и сервер. Однако программа зависает, ожидая какого-то неизвестного обратного вызова. Два вопроса:

  • Ожидается ли следующая программа?
  • Есть ли инструмент для диагностики выдающихся обратных вызовов в node программах?

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: изменилось имя переменной WebSocket на ws, чтобы избежать путаницы

Ответ 1

var socket = io.listen(server);

Вы создали сокет на порту. Вы никогда не закрывали его.

socket.server.close() закрывает ваш (socket.io) сокет.

В случае сомнений прочтите socket.io github примеры

socket.server === server Это сервер, в который вы проходите, в выражении liste, поэтому он закрыт. Я не уверен, чего он ждет.

Ответ 2

Ниже вы можете отключить все подключения и выполнить несколько тестов экспресса (используя socket.io и socket.io-client).

Решение сложное и багги, но работает на 0.8.5. Основная проблема заключается в том, что библиотека использует websockets (node -websocket-client).

В настоящее время на socket.io вкладчики ОС исправили клиент websocket. Итак, мы должны сделать то же самое в нашем пакете npm-пакета socket.io-client, чтобы иметь возможность использовать метод finishClose на стороне сокета-сокета. Socket.io-client использует библиотеку websocket как пакет npm, поэтому вы должны найти файл (websocket.js) и заменить его на файл socket.io.

Впоследствии вы можете использовать метод finishClose, чтобы убедиться, что соединения закрыты и с некоторыми настраиваемыми настройками сервера/клиента, тесты будут работать правильно.

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

Надеюсь, кто-то может помочь.

Ответ 3

Программа ожидает, потому что socket.io(сервер) все еще прослушивает входящие соединения. Я не знаю, как остановить слушание.