4
votes

I am trying to create a chat application with out using Google message services and with nodejs xmpp server. So I used this node js xmpp server and smack api for android app.

I dont know why but server is sending stanza saying feature not implemented.

android code which I wrote to connect xmpp server.

XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                    .setServiceName("localhost")
                    .setHost(IPADRESS)
                    .setPort(5222)
                    .build();
            AbstractXMPPConnection conn2 = new XMPPTCPConnection(config);
            conn2.setPacketReplyTimeout(1000);
            SmackConfiguration.DEBUG = true;
            conn2.connect();

            conn2.login(mngr.getDeviceId(), "secret");

nodejs xmpp server module

var startServer = function (done) {
  // Sets up the server.
  server = new xmpp.C2S.TCPServer({
    port: 5222,
    domain: 'localhost'
  })

  // On connection event. When a client connects.
  server.on('connection', function (client) {
    // That's the way you add mods to a given server.

    // Allows the developer to register the jid against anything they want
    client.on('register', function (opts, cb) {
      console.log('REGISTER')
      cb(true)
    })

    // Allows the developer to authenticate users against anything they want.
    client.on('authenticate', function (opts, cb) {
      console.log('server:', opts.username, opts.password, 'AUTHENTICATING')
      if (opts.password === 'secret') {
        console.log('server:', opts.username, 'AUTH OK')
        cb(null, opts)
      } else {
        console.log('server:', opts.username, 'AUTH FAIL')
        cb(false)
      }
    })

    client.on('online', function () {
      console.log('server:', client.jid.local, 'ONLINE')
     client.send("")

    })

    // Stanza handling
    client.on('stanza', function (stanza) {
      console.log('server:', client.jid.local, 'stanza', stanza.toString())
      var from = stanza.attrs.from
      stanza.attrs.from = stanza.attrs.to
      stanza.attrs.to = from
      client.send(stanza)
    })
    // Stanza handling
    client.on('chat', function (stanza) {
      console.log('server:', client.jid.local, 'chat', stanza.toString())
      client.send(stanza)
    });

    // On Disconnect event. When a client disconnects
    client.on('disconnect', function () {
      console.log('server:',  'DISCONNECT')
    })
  })

  server.on('listening', done)
}
startServer(function (){

    console.log("server localhost started at 5222 localport");
});

nodejs server console output.

server localhost started at 5222 localport
server: 354223060799129 secret AUTHENTICATING
server: 354223060799129 AUTH OK
server: 354223060799129 ONLINE
server: 354223060799129 stanza <iq id="eW469-5" type="get" xmlns:stream="http://etherx.jabber.org/streams" from="354223060799129@localhost/Smack"><query xmlns="jabber:iq:roster"/></iq>
server: 354223060799129 stanza <presence id="eW469-6" xmlns:stream="http://etherx.jabber.org/streams" from="354223060799129@localhost/Smack"/>
server: 354223060799129 stanza <iq id="eW469-5" type="error" xmlns:stream="http://etherx.jabber.org/streams" from="354223060799129@localhost/Smack"><error type="cancel"><feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>

android logs:

03-10 22:57:12.598 8126-8183/gcm.play.android.samples.com.gcmquickstart E/AbstractXMPPConnection: Exception in packet listener
                                                                                                  java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference
                                                                                                      at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:746)
                                                                                                      at org.jivesoftware.smack.roster.Roster$PresencePacketListener.getUserPresences(Roster.java:1134)
                                                                                                      at org.jivesoftware.smack.roster.Roster$PresencePacketListener.processPacket(Roster.java:1157)
                                                                                                      at org.jivesoftware.smack.AbstractXMPPConnection$4.run(AbstractXMPPConnection.java:1156)
                                                                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                                                      at java.lang.Thread.run(Thread.java:818)
03-10 22:57:12.598 8126-8185/gcm.play.android.samples.com.gcmquickstart E/Roster: Exception reloading roster
                                                                                  XMPPError: feature-not-implemented - cancel
                                                                                      at org.jivesoftware.smack.AbstractXMPPConnection$5.processPacket(AbstractXMPPConnection.java:1448)
                                                                                      at org.jivesoftware.smack.AbstractXMPPConnection$3.run(AbstractXMPPConnection.java:1126)
                                                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                                                      at java.lang.Thread.run(Thread.java:818)

I tried so many solution for the similar type of question in stackoverflow but didnt work.help will be appreciated.

1

1 Answers

1
votes

The node XMPP server project you linked is not a complete XMPP server. Its a XMPP server library which helps you to build a XMPP server with node.js.

In your log it returns the not implemented exception when you try to request the roster (contact list).

You either have to implement all the features you need in Javascript, or choose another existing feature complete XMPP software.