断开node-xmpp客户端

时间:2013-03-02 14:21:02

标签: javascript node.js xmpp node-xmpp

我正在关注node-xmppnode-simple-xmpp,我正在尝试建立一个简单的客户端 一切正常,除了断开连接。

我在simple-xmpp的example之后创建了以下文件:

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

xmpp.on('online', function() {
    console.log('Yes, I\'m connected!');
    xmpp.send('test2@example.com', 'Hello test');
    // OK UNTIL HERE, DISCONNECT NOW
});

xmpp.connect({jid: 'test@example.com/webchat', password: 'test', reconnect: 'false'}); 

但我不知道如何断开连接。我试图发送一个类型不可用的节:

stanza = new xmpp.Element('presence', {from: 'test@example.com', type: 'unavailable'});
xmpp.conn.send(stanza);
delete xmpp;

这导致客户端暂时脱机,但问题是,它在几秒钟后重新连接并继续发送'presence'节。

我也尝试过调用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

那么,我做错了什么?我确信有一种简单的方法可以断开连接。

2 个答案:

答案 0 :(得分:3)

在第一种情况下,<presence type='unavailable'/>并不总是真正断开你;在您的服务器中,它看起来可能是,但您的客户端是自动重新连接。 delete xmpp实际上并没有导致您的对象被清理,只是将其从本地名称空间中删除。

在第二种情况下,send()没有立即将您的节写入底层套接字。如果您之后立即用end()关闭套接字,则在写入实际发生时关闭套接字。

如果您在致电send()后添加短暂超时,则在致电end()之前它会起作用。为了使它,你需要你的库开发人员在send()实际写入套接字时给你一个回调。

答案 1 :(得分:1)

您还应该查看http://tools.ietf.org/html/rfc7395

简而言之,如果客户端用于打开连接,它应该用来杀死同一个连接。

更确切地说:

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

&#34; Joe Hildebrand的解决方案&#34;也解决了我的问题,但这对我来说似乎更合适。