我正在关注node-xmpp和node-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
那么,我做错了什么?我确信有一种简单的方法可以断开连接。
答案 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;也解决了我的问题,但这对我来说似乎更合适。