12

ノードjsとxmppで最初のステップを行います

メッセージングのためにノードjsのxmppサーバーで実行する必要があります

プロセスは次のとおりです: node-xmpp サーバーを使用しますhttps://github.com/astro/node-xmppサーバー の例を実行します (/examples/c2s.js) 2 つのクライアントでサーバーに参加します (他のサーバーでテストされたクライアントは jabber - 動作し、メッセージが送信されます)

クライアントは私のサーバーで承認されています。しかし、あるクライアントから別のクライアントにメッセージを送信すると、メッセージはサーバーに届き (ログに表示されます)、メッセージは受信者に届きません。

問題のあるサーバー構成を探す場所がわかりません。ルーティング ?自分を追加するにはメッセージが必要な場合がありますか?

助けてください

私のサーバーコード(例による)

var xmpp = require('../lib/node-xmpp');

var c2s = new xmpp.C2SServer({
    port: 5222,
    domain: 'localhost'

});

// On Connect event. When a client connects.
c2s.on("connect", function(client) {
    c2s.on("register", function(opts, cb) {
        console.log("REGISTER");
    cb(true);
    });

    client.on("authenticate", function(opts, cb) {
        console.log("AUTH" + opts.jid + " -> " +opts.password); 
    cb(null); 
    });

    client.on("online", function() {
        console.log("ONLINE");
        client.send(new xmpp.Message({ type: 'chat' }).c('body').t("Hello there, little client."));
    });

    client.on("stanza", function(stanza) {
        console.log("STANZA" + stanza);

    });

    client.on("disconnect", function(client) {
        console.log("DISCONNECT");
    });

});

サーバーを実行し、このコードで接続します

var xmpp = require('../lib/node-xmpp');
var argv = process.argv;

if (argv.length < 6) {
    console.error('Usage: node send_message.js <my-jid> <my-password> <my-text> <jid1> [jid2] ... [jidN]');
    process.exit(1);
}

var cl = new xmpp.Client({ jid: argv[2], password: argv[3] });

cl.addListener('online',
   function() {argv.slice(5).forEach(
       function(to) {cl.send(new xmpp.Element('message', { to: to,type: 'chat'}).c('body').t(argv[4]));
       });

       // nodejs has nothing left to do and will exit
       // cl.end();
   });

cl.addListener('stanza',
    function(stanza) {
        if (stanza.is('message') &&
            // Important: never reply to errors!
            stanza.attrs.type !== 'error') {
            console.log("New message");
            // Swap addresses...
            stanza.attrs.to = stanza.attrs.from;
            delete stanza.attrs.from;
            // and send back.
            cl.send(stanza);
        }
    });

cl.addListener('error',
    function(e) {
       console.error(e);
       process.exit(1);
   });
4

5 に答える 5

5

簡単な答え: に変更cb(null)cb(null, opts)ます。

長い答え:

  1. client.on("authenticate", function(opts, cb) {...})クライアントが自分自身を認証しようとしたときにサーバーが行うことを登録します。node-xmpp 内では、最初に認証メカニズムが検索され、次にメカニズムがコールバックを呼び出して認証結果を取得しますcb

  2. デフォルトでは、Plain認証が使用されます。ここでその仕組みを確認できます: https://github.com/node-xmpp/node-xmpp-server/blob/master/lib/authentication/plain.js。Plainを使用するoptsと、jid とパスワードが保存されます。

  3. 次に、node-xmpp に認証の失敗/成功を通知するにはmechanismhttps://github.com/node-xmpp/node-xmpp-server/blob/master/lib/authentication/mechanism.jsを調べる必要があります。プレーン。 this.authenticate(this.extractSasl(auth), function (err, user) { if (!err && user) { self.success(user) } else { self.failure(err) } }) ここでは、 cb2 つのパラメーターが必要です。errが null で、 null 以外の場合はuser、認証の成功を示します。そうでなければ、失敗しました。

于 2014-04-04T19:44:57.563 に答える
2

私は node.js も xmpp も専門家ではありません。しかし、あなたのコードを読んでください。「スタンザ」は、クライアントがメッセージを送信したイベントだと思います。メッセージをログに記録するように依頼しましたが、受信者にルーティングする方法についての指示はありませんでした。サーバーで受信したメッセージをメッセージ本文と受信者に分解し、サーバーに受信者に送信するように依頼する必要があります。

于 2013-10-25T08:17:45.103 に答える
1

Alex は、サーバーとクライアントの間でストリームを接続する C2SServer を使用しました。あるクライアントから別のクライアントにメッセージを送信すると、メッセージはサーバーに到達します。現在、それらを実際の受信者に中継するサーバーの責任があります。

考えられる解決策の 1 つは、クライアントが認証されたときにクライアント オブジェクトをその jid に対応するグローバル オブジェクトに保持することです。そのクライアントのメッセージを取得すると、グローバル変数からそれを取得し、グローバル変数に保持されている実際のクライアントにメッセージをルーティングできます。

于 2014-04-03T14:23:29.867 に答える
1

サーバーからテキスト メッセージと受信者の JID を取得できます。次の方法でスタンザを分割し、これをエラーリスナーの前に置くだけです:-

cl.on('stanza', function(stanza) {
   if (stanza.is('message') && (stanza.attrs.type !== 'error')) {
       var body = stanza.getChild('body');
       if (!body) {
         return;
       }
       console.log(stanza.attrs.from+" Says: "+body.children[0]);
   }
});
于 2015-03-12T06:35:18.700 に答える
0

「認証」では、引数がコールバックに十分でない場合がありますか?

NG:
cb(null);

OK:
cb(null, opts);
于 2014-03-18T12:33:41.537 に答える