我在节点js和xmpp
中进行了第一步我需要在节点js上的xmpp服务器上运行以进行消息传递
这是一个过程: 我使用node-xmpp服务器https://github.com/astro/node-xmpp 运行服务器的示例(/examples/c2s.js) 加入到具有两个客户端的服务器(在其他服务器jabber上测试的客户端 - 它工作正常,消息正在发送)
客户端在我的服务器上拥有授权。 但是当我从一个客户端向另一个客户端发送消息时,消息将发送到服务器(我在日志中看到它) 那就是消息没有发给收件人
我不知道在哪里寻找问题 服务器配置?路由?添加消息可能是必要的吗?
帮我plz
我的服务器代码(通过示例)
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);
});
答案 0 :(得分:5)
答案简短:将cb(null)
更改为cb(null, opts)
。
答案很长:
client.on("authenticate", function(opts, cb) {...})
注册服务器在客户端尝试进行身份验证时将执行的操作。在node-xmpp内部,它将首先查找身份验证机制,然后该机制将调用回调并通过cb
检索身份验证结果。
默认情况下,使用Plain
身份验证。您可以在此处查看其工作原理:https://github.com/node-xmpp/node-xmpp-server/blob/master/lib/authentication/plain.js。使用Plain opts
存储jid和密码。
然后告知node-xmpp身份验证失败/过度,我们需要查看Plain继承的mechanism
,https://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
为非空时,它表示身份验证成功。否则,失败。
答案 1 :(得分:1)
我既不是node.js也不是xmpp的专家。但是阅读你的代码。我假设&#34;节&#34;是客户端发送消息的事件。您要求它记录消息,但您没有说明如何将其路由到收件人。您应该将服务器上收到的消息分解为邮件正文和收件人,并要求您的服务器将其发送给收件人。
答案 2 :(得分:1)
Alex你使用C2SServer连接服务器和客户端之间的流。当您从一个客户端向另一个客户端发送消息时,它们将转到服务器。现在它的服务器负责将它们转发回实际的接收器。
一种可能的解决方案是在客户端进行身份验证时保持客户端对象是与其jids对应的全局对象,当您获得该客户端的消息时,您可以从全局变量获取该消息并将消息路由到保存在全局变量中的实际客户端
答案 3 :(得分:1)
您可以收到短信&amp;来自服务器的接收器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]);
}
});
答案 4 :(得分:0)
在“authenticate”中,参数可能不足以进行回调吗?
NG:
cb(null);
OK:
cb(null, opts);