Отключить клиент node-xmpp

Я смотрю на node-xmpp и node-simple-xmpp и я пытаюсь сделать простой клиент.
Все работает нормально, кроме отключения.

Я создал следующий файл после примера из простого xmpp:

var xmpp = require('simple-xmpp');

xmpp.on('online', function() {
    console.log('Yes, I\'m connected!');
    xmpp.send('[email protected]', 'Hello test');
    // OK UNTIL HERE, DISCONNECT NOW
});

xmpp.connect({jid: '[email protected]/webchat', password: 'test', reconnect: 'false'}); 

Но я не знаю, как отключиться. Я попытался отправить строфу с недоступным типом:

stanza = new xmpp.Element('presence', {from: '[email protected]', type: 'unavailable'});
xmpp.conn.send(stanza);
delete xmpp;

Это приводит к тому, что клиент временно отключается, но проблема в том, что он повторно подключается через несколько секунд и продолжает отправлять строфу «присутствие».

Я также пытался вызвать xmpp.conn.end(), который также отключается, но впоследствии выдает ошибку:

node_modules/simple-xmpp/node_modules/node-xmpp/lib/xmpp/connection.js:100
    if (!this.socket.writable) {
                    ^
TypeError: Cannot read property 'writable' of undefined

Итак, что я делаю неправильно? Я уверен, что есть простой способ отключиться.


person mutil    schedule 02.03.2013    source источник


Ответы (2)


В первом случае <presence type='unavailable'/> не всегда отключает вас; на вашем сервере это выглядит так, но ваш клиент автоматически переподключается. delete xmpp на самом деле не приводит к очистке вашего объекта, а просто удаляет его из локального пространства имен.

Во втором случае send() не сразу записывает вашу строфу в базовый сокет. Если вы закроете сокет с помощью end() сразу после этого, сокет закроется, когда запись действительно произойдет.

Если вы добавите короткий тайм-аут после вызова send(), перед вызовом end() он сработает. Чтобы сделать его хорошим, вам нужно, чтобы разработчики вашей библиотеки давали вам обратный вызов, когда send() фактически записывает данные в сокет.

person Joe Hildebrand    schedule 04.03.2013
comment
Спасибо за ответ, это сработало даже с setTimeout(function(){ xmpp.conn.end() }, 1); - person mutil; 05.03.2013

Вам также следует проверить это на http://tools.ietf.org/html/rfc7395.

Короче говоря, если клиент использует для открытия соединения, он должен использовать для уничтожения того же соединения.

Чтобы быть более точным:

<close xmlns="urn:ietf:params:xml:ns:xmpp-framing" />

Решение "Joe Hildebrand" также решило мою проблему, но мне это показалось более правильным.

person Mihajlo Supic    schedule 27.05.2015
comment
пожалуйста, дайте полный ответ на вопрос, а не только ссылку на объявление, ссылка может быть устаревшей. - person slfan; 27.05.2015
comment
Извините, я не поместил часть кода в теги кода, поэтому он не был виден, поэтому я фактически предоставил полный ответ, но недружественный для браузера: D Отредактировано;) - person Mihajlo Supic; 27.05.2015