2

我正在查看node-xmppnode-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'}); 

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

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

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

4

2 回答 2

3

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

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

如果您在调用之后添加一个短暂的超时,那么send()在调用之前end()它将起作用。为了使它变得更好send(),您会希望您的库开发人员在实际写入套接字时给您一个回调。

于 2013-03-04T17:14:24.270 回答
1

您还应该检查一下https://www.rfc-editor.org/rfc/rfc7395

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

更准确地说:

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

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

于 2015-05-27T09:04:45.817 回答