断开node-xmpp客户端

我正在看node-xmpp和node-simple-xmpp ,我试图做一个简单的客户端。
一切工作正常,除了断开连接。

在simple-xmpp的例子后,我做了如下的文件:

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

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

 stanza = new xmpp.Element('presence', {from: 'test@example.com', 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 

那么,我做错了什么? 我相信有一个简单的方法来断开连接。

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

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

如果你在调用send()之后添加一个短暂的超时,在调用end()之前它会起作用。 为了做到这一点,你会希望你的库开发人员在send()实际写入套接字时给你一个callback。

你也应该检查一下http://tools.ietf.org/html/rfc7395

总之,如果客户端正在使用打开连接,它应该使用杀死同一个连接。

更确切地说:

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

“乔·希尔德布兰德”的解决scheme也解决了我的问题,但这对我来说似乎更合适。