NodeJS xmpp服务器

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

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

下面是这个过程:我使用node-xmpp服务器https://github.com/astro/node-xmpp运行一个服务器(/examples/c2s.js)连接到服务器的例子有两个客户端(在其他服务器上testing的客户端jabber – 它的工作和消息通过发送)

客户端在我的服务器上有授权。 但是,当我从一个客户端发送消息到另一个消息到达服务器(我在日志中看到它),这是消息不来接收

我不知道在哪里寻找问题服务器configuration? 路由? 消息可能有必要添加自己?

帮助我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); }); 

简而言之:将cb(null)更改为cb(null, opts)

漫长的回答:

  1. client.on("authenticate", function(opts, cb) {...})logging了当客户端尝试authentication自己时,服务器会做什么。 在node-xmpp中,它将首先查找authentication机制,然后机制将调用callback并通过cb检索authentication结果。

  2. 默认情况下,使用Plainauthentication。 你可以看看它是如何工作的: https : //github.com/node-xmpp/node-xmpp-server/blob/master/lib/authentication/plain.js 。 用普通的opts存储贾德和密码。

  3. 然后通知node-xmpp身份validation失败/失败,我们需要查看mechanismhttps://github.com/node-xmpp/node-xmpp-server/blob/master/lib/authentication/mechanism.js ,inheritance平原。 this.authenticate(this.extractSasl(auth), function (err, user) { if (!err && user) { self.success(user) } else { self.failure(err) } })这里cb需要两个参数。 当err为空且user为非空时,表示authentication成功。 否则,失败。

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

亚历克斯你已经使用C2SServer连接服务器和客户端之间的stream。 当你从一个客户端发送消息到另一个客户端时,他们到达服务器。 现在,服务器负责将它们转发回实际的接收方。

一个可能的解决scheme是,当客户端通过身份validation时,客户端对象是与其jid对应的全局对象,当您为该客户端获取消息时,您可以从全局variables中获取该消息,并将消息路由到保存在全局variables中的实际客户端。

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

在“authentication”中,一个参数可能不足以进行callback?

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