【问题标题】:Disconnect node-xmpp client断开 node-xmpp 客户端
【发布时间】:2013-02-17 00:06:05
【问题描述】:

我正在查看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

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

【问题讨论】:

    标签: javascript node.js xmpp node-xmpp


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答,即使使用 setTimeout(function(){ xmpp.conn.end() }, 1); 也有效
    【解决方案2】:

    你也应该看看https://www.rfc-editor.org/rfc/rfc7395

    简而言之,如果客户端使用打开连接,它应该使用终止相同的连接。

    更准确地说:

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

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

    【讨论】:

    • 请提供问题的完整答案,而不仅仅是链接广告链接可能已过期。
    • 对不起,我没有将部分代码放在“代码标签”中,所以它不可见,所以我实际上提供了完整的答案,但对浏览器不友好:D 已编辑;)
    猜你喜欢
    • 1970-01-01
    • 2014-12-16
    • 2014-04-29
    • 2016-08-18
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2012-07-20
    • 2012-01-07
    相关资源
    最近更新 更多