Как правильно закрыть 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(сервер) все еще прослушивает входящие соединения. Я не знаю, как остановить слушание.