2013-09-25 3 views
9

я делаю первые шаги в узле JS и XMPPNodeJS XMPP сервер

мне нужно запустить на XMPP сервер на узле JS для обмена сообщениями

Вот процесс: Я использую сервер узла XMPP https://github.com/astro/node-xmpp запустите пример сервера (/examples/c2s.js) присоединитесь к серверу с двумя клиентами (клиенты тестировали на других серверах jabber - он работает и отправляет сообщения)

У клиентов есть авторизация на моем сервере. Но когда я отправляю сообщение от одного клиента к другому, то сообщение приходит на сервер (я вижу в журналах) , и это было сообщение не приходит к получателю

Я незнаю где искать для проблемы конфигурации сервера ? маршрутизация? может понадобиться обмен сообщениями, чтобы добавить себя?

помочь мне плз

мой код сервера (на примерах)

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

В "authenticate", может ли аргумент быть недостаточным для обратного вызова?

NG: 
cb(null); 

OK: 
cb(null, opts); 
1

Alex Вы использовали 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. С Plain opts хранит jid и пароль.

  3. Затем, чтобы сообщить узлу-xmpp, что аутентификация не удалась/не удалось, нам нужно посмотреть mechanism, https://github.com/node-xmpp/node-xmpp-server/blob/master/lib/authentication/mechanism.js, унаследованный Plain. this.authenticate(this.extractSasl(auth), function (err, user) { if (!err && user) { self.success(user) } else { self.failure(err) } }) Здесь cb требует два параметра. Когда err имеет значение null и user не имеет значения null, он указывает на успехи в аутентификации. В противном случае сбой.

1

Вы можете получить текстовое сообщение & приемник JID с сервера. Просто переломите 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]); 
    } 
}); 
Смежные вопросы