2013-09-25 7 views
9

मैं नोड js और xmppNodeJS xmpp सर्वर

में पहला कदम बनाने मैं

यहाँ संदेश भेजने के लिए नोड js पर xmpp सर्वर पर चलाने की आवश्यकता प्रक्रिया है: मैं नोड xmpp सर्वर का उपयोग https://github.com/astro/node-xmpp एक सर्वर (/examples/c2s.js) का उदाहरण चलाएं दो क्लाइंट्स के साथ सर्वर में शामिल हों (क्लाइंट अन्य सर्वर जेबबर पर परीक्षण किया जाता है - यह काम करता है और संदेश भेज रहे हैं)

ग्राहकों के पास मेरे सर्वर पर प्राधिकरण है। लेकिन जब मैं एक से दूसरे ग्राहक से एक संदेश भेजने, संदेश (मैं लॉग में यह देखें) सर्वर से आता है और कि प्राप्तकर्ता को नहीं आती संदेश था

मैं `डॉन पता नहीं जहां देखने के लिए समस्या के लिए सर्वर कॉन्फ़िगरेशन? रूटिंग? खुद को जोड़ने के लिए संदेश आवश्यक हो सकता है?

मुझे 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। लेकिन अपना कोड पढ़ना। मुझे लगता है कि "stanza" वह घटना है जहां एक ग्राहक ने एक संदेश भेजा था। आपने इसे संदेश लॉग करने के लिए कहा था, लेकिन आपने प्राप्तकर्ता को इसे रूट करने के तरीके पर कोई निर्देश नहीं दिया था। आपको संदेश निकाय और प्राप्तकर्ता में सर्वर पर प्राप्त संदेश को तोड़ना चाहिए, और अपने सर्वर से प्राप्तकर्ता को भेजने के लिए कहें।

0

"प्रमाणीकृत" में, क्या कोई तर्क कॉलबैक के लिए पर्याप्त नहीं हो सकता है?

NG: 
cb(null); 

OK: 
cb(null, opts); 
1

एलेक्स आपने सी 2 एसएस सर्वर का उपयोग किया है जो सर्वर और क्लाइंट के बीच एक स्ट्रीम को जोड़ता है। जब आप एक क्लाइंट से दूसरे क्लाइंट में संदेश भेजते हैं तो वे सर्वर पर जाते हैं। अब सेवर की जिम्मेदारी उन्हें वास्तविक रिसीवर पर वापस रिले करने के लिए है।

क्लाइंट ऑब्जेक्ट क्लाइंट ऑब्जेक्ट को क्लाइंट ऑब्जेक्ट करते समय एक वैश्विक वस्तु है, जब क्लाइंट प्रमाणीकृत होता है, जब आप उस क्लाइंट के लिए संदेश प्राप्त करते हैं तो आप इसे वैश्विक चर से प्राप्त कर सकते हैं और वैश्विक स्तर पर संदेश को वास्तविक क्लाइंट में भेज सकते हैं चर।

5

संक्षिप्त उत्तर: cb(null) से cb(null, opts) बदलें।

विस्तृत उत्तर है:

  1. client.on("authenticate", function(opts, cb) {...}) रजिस्टरों जब ग्राहक खुद को प्रमाणित करने की कोशिश करता है क्या सर्वर करेंगे। नोड-एक्सएमपीपी के अंदर, यह पहले प्रमाणीकरण तंत्र की तलाश करेगा और तंत्र तब कॉलबैक को कॉल करेगा और प्रमाणीकरण परिणामों को cb के माध्यम से पुनर्प्राप्त करेगा।

  2. डिफ़ॉल्ट रूप से, Plain प्रमाणीकरण का उपयोग किया जाता है। आप यहां देख सकते हैं कि यह यहां कैसे काम करता है: https://github.com/node-xmpp/node-xmpp-server/blob/master/lib/authentication/plain.js। सादा के साथ opts जिड और पासवर्ड स्टोर करता है।

  3. फिर प्रमाणीकरण विफल/सशक्त नोड-एक्सएमपीपी को सूचित करने के लिए, हमें 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

आप पाठ संदेश & सर्वर से रिसीवर जेआईडी प्राप्त कर सकते हैं। बस निम्नलिखित तरीकों से stanza तोड़ें और त्रुटि श्रोताओं से पहले इसे डालें: -

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]); 
    } 
});