2013-09-25 177 views
9

我做的節點JS和XMPP的NodeJS XMPP服務器

的第一步,我需要在XMPP服務器節點JS運行的消息

具體的過程: 我使用節點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

請發佈有問題的代碼,否則我們沒有任何信息,只會猜測! – MattJ

+0

您是否正在使用發件之前的發件人? – Robert

回答

1

我既不節點上​​沒有專家連接到它.js和xmpp。但是閱讀你的代碼。我假定「節」是客戶發送消息的事件。您要求它記錄該消息,但您沒有說明如何將其路由到收件人。您應該將服務器上收到的消息分解成消息正文和收件人,並要求服務器將其發送給收件人。

0

在「驗證」中,一個參數可能不足以進行回調?

NG: 
cb(null); 

OK: 
cb(null, opts); 
1

亞歷克斯你已經使用C2SServer連接服務器和客戶端之間的流。當你從一個客戶端發送消息到另一個客戶端時,他們會到達服務器。現在服務器負責將它們轉發回實際接收方。

一個可能的解決方案是,當客戶端通過身份驗證時,客戶端對象是與其jids對應的全局對象,當您獲取該客戶端的消息時,您可以從全局變量獲取該消息,並將消息路由到保持全局的實際客戶端變量。

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。用平原opts存儲賈德和密碼。

  3. 然後爲了通知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

您可以從服務器獲取短信&接收方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]); 
    } 
});