2016-03-10 37 views
4

我想创建一个聊天应用程序与出去使用谷歌消息服务和nodejs xmpp服务器。 因此,我使用了this node js xmpp server,并为android应用程序使用了api。功能没有实现nodejs xmpp android

我不知道为什么,但服务器发送节说功能没有实现。

我写的连接xmpp服务器的android代码。

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服务器模块

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 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="[email protected]/Smack"><query xmlns="jabber:iq:roster"/></iq> 
server: 354223060799129 stanza <presence id="eW469-6" xmlns:stream="http://etherx.jabber.org/streams" from="[email protected]/Smack"/> 
server: 354223060799129 stanza <iq id="eW469-5" type="error" xmlns:stream="http://etherx.jabber.org/streams" from="[email protected]/Smack"><error type="cancel"><feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq> 

的Android日志:

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) 

我尝试了许多解决方案,用于计算器的相似类型的问题但没有work.help将不胜感激。

回答

1

您链接的节点XMPP服务器项目不是完整的XMPP服务器。它是一个XMPP服务器库,可帮助您使用node.js构建XMPP服务器。

在您的日志中,当您尝试请求名单(联系人列表)时,它会返回未实现的异常。

您必须使用Javascript实现您需要的所有功能,或者选择另一个现有的功能完整的XMPP软件。

+0

我是新来的xmpp。如何实现xmpp功能。是否有任何文档? –

+1

去这里: http://xmpp.org/extensions/index.html 和研究RFC 6120和6121.或者正如我建议刚从一个完整的XMPP服务器开始。您可以在这里找到一些选项: http://xmpp.org/software/servers.html – Alex

+0

谢谢。有没有关于使用现有服务器和编写我们自己的服务器的文档? –