Node.js nodejsxmpp服务器

Node.js nodejsxmpp服务器,node.js,xmpp,Node.js,Xmpp,我在节点js和xmpp中完成了第一步 我需要在节点js上的xmpp服务器上运行消息传递 过程如下: 我使用节点xmpp服务器 运行服务器的示例(/examples/c2s.js) 使用两个客户机连接到服务器(在其他服务器上测试的客户机jabber-它可以工作,并且消息正在发送) 客户端在我的服务器上具有授权。 但是,当我从一个客户机向另一个客户机发送消息时,消息会传到服务器(我在日志中看到) 而这就是信息没有送达收件人的原因 我不知道到哪里去找这个问题 服务器配置?路由?添加您自己可能需要发送消

我在节点js和xmpp中完成了第一步

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

过程如下: 我使用节点xmpp服务器 运行服务器的示例(/examples/c2s.js) 使用两个客户机连接到服务器(在其他服务器上测试的客户机jabber-它可以工作,并且消息正在发送)

客户端在我的服务器上具有授权。 但是,当我从一个客户机向另一个客户机发送消息时,消息会传到服务器(我在日志中看到) 而这就是信息没有送达收件人的原因

我不知道到哪里去找这个问题 服务器配置?路由?添加您自己可能需要发送消息

请帮帮我

我的服务器代码(通过示例)

我运行一个服务器并通过此代码连接到它

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);
   });
var-xmpp=require('../lib/node-xmpp');
var argv=process.argv;
如果(argv.length<6){
console.error('用法:node send_message.js[jid2]…[jidN]”);
过程。退出(1);
}
var cl=new xmpp.Client({jid:argv[2],密码:argv[3]});
cl.addListener(“在线”,
函数(){argv.slice(5.forEach(
函数(to){cl.send(新的xmpp.Element('message',{to:to,键入:'chat'}).c('body').t(argv[4]);
});
//nodejs已无事可做,将退出
//cl.end();
});
cl.addListener('节',
功能(节){
if(第is节(“消息”)&&
//重要提示:永远不要回复错误!
节.attrs.type!=“错误”){
控制台日志(“新消息”);
//交换地址。。。
stanza.attrs.to=stanza.attrs.from;
从中删除节.attrs.from;
//然后送回去。
cl.send(节);
}
});
cl.addListener('错误',
职能(e){
控制台错误(e);
过程。退出(1);
});

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

在“身份验证”中,参数可能不足以进行回调

NG:
cb(null);

OK:
cb(null, opts);

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


一种可能的解决方案是,当客户机经过身份验证时,将客户机对象保持为与其JID相对应的全局对象,当您获得该客户机的消息时,您可以从全局变量获取该消息,并将该消息路由到保存在全局变量中的实际客户机。

简短回答:将
cb(null)
更改为
cb(null,opts)

答案很长:

  • client.on(“authenticate”,函数(opts,cb){…})
    注册当客户端尝试对自己进行身份验证时服务器将执行的操作。在节点xmpp内部,它将首先查找身份验证机制,然后该机制将调用回调并通过
    cb
    检索身份验证结果

  • 默认情况下,使用
    普通
    身份验证。您可以在此处查看它的工作原理:。使用普通的
    选项
    存储jid和密码

  • 然后,为了通知节点xmpp身份验证失败/成功,我们需要研究由Plain继承的
    机制。
    
    
    this.authenticate(this.extractSasl(auth)、函数(err、user){
    如果(!err&&user){
    自我成功(用户)
    }否则{
    自我失败(err)
    }
    })
    
    这里,
    cb
    需要两个参数。当
    err
    为空且
    user
    为非空时,表示身份验证成功。否则,就失败了


  • 您可以从服务器获取文本消息和接收方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]);
       }
    });
    

    请张贴有问题的代码,否则我们没有任何信息,将只是猜测!在发送之前,您要将收件人替换为发件人?
    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]);
       }
    });