2

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

しかし、切断する方法がわかりません。使用できないタイプのスタンザを送信しようとしました:

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オブジェクトが実際にクリーンアップされるのではなく、ローカル名前空間からオブジェクトが削除されるだけです。

2番目のケース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" />

「ジョーヒルデブランド」の解決策も私の問題を解決しましたが、これは私にとってより適切な方法のようでした。

于 2015-05-27T09:04:45.817 に答える