【问题标题】:NodeJS xmpp serverNodeJS xmpp 服务器
【发布时间】:2013-09-30 19:29:56
【问题描述】:

我在节点js和xmpp中迈出了第一步

我需要在节点 js 上的 xmpp 服务器上运行以进行消息传递

流程如下: 我使用 node-xmpp 服务器https://github.com/astro/node-xmpp 运行服务器示例 (/examples/c2s.js) 使用两个客户端加入服务器(在其他服务器上测试的客户端 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);
   });

【问题讨论】:

  • 请贴出有问题的代码,否则我们没有信息,只是猜测!
  • 您在发送前将 to 替换为 from?

标签: node.js xmpp


【解决方案1】:

简短的回答:将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 身份验证失败/成功,我们需要查看由 Plain 继承的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) } }) 这里,cb 需要两个参数。当err为空且user为非空时,表示认证成功。否则,失败。

【讨论】:

    【解决方案2】:

    我不是 node.js 和 xmpp 方面的专家。但是阅读您的代码。我假设“节”是客户端发送消息的事件。您要求它记录消息,但您没有说明如何将其路由到收件人。您应该将服务器上收到的消息分解为消息正文和收件人,并要求您的服务器将其发送给收件人。

    【讨论】:

      【解决方案3】:

      Alex 您使用了 C2SServer,它连接了服务器和客户端之间的流。当您从一个客户端向另一个客户端发送消息时,它们会到达服务器。现在由服务器负责将它们转发回实际的接收者。

      一种可能的解决方案是在客户端通过身份验证时,让客户端对象是与其 jid 对应的全局对象,当您收到该客户端的消息时,您可以从全局变量中获取该消息并将消息路由到保存在全局变量中的实际客户端.

      【讨论】:

        【解决方案4】:

        您可以从服务器获取短信和接收者 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]);
           }
        });
        

        【讨论】:

          【解决方案5】:

          在“authenticate”中,一个参数可能不足以进行回调吗?

          NG:
          cb(null);
          
          OK:
          cb(null, opts);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-01-24
            • 2011-07-08
            • 2015-08-26
            • 1970-01-01
            • 2011-01-20
            • 1970-01-01
            • 2013-06-26
            相关资源
            最近更新 更多