aSmack XMPP 库不工作

Posted

技术标签:

【中文标题】aSmack XMPP 库不工作【英文标题】:aSmack XMPP lib not working 【发布时间】:2011-03-01 14:24:14 【问题描述】:

我正在尝试让 aSmack 在我的项目中工作。 在eclipse中创建了一个标准项目,添加了jar来构建路径/库。开始使用 XMPP 类,但我不确定我是否应该做其他事情来正确设置项目(稍后),因为它不起作用。 在 Service 中,我启动 AsnycTask 以连接到 google talk 并发送一条聊天消息。

conn1 = new XMPPConnection(config);
// connecting to the server
try 
    conn1.connect();
    Log.v(LOG_TAG, "XMPP connected");
 catch (XMPPException xe) 
    msg = "XMPPException during connect(): " + xe.getMessage();
    Log.v(LOG_TAG, msg);


// login
try 
    conn1.login(USERNAME, PASSWORD, RESOURCE);
    msg = "login ok";
    Log.v(LOG_TAG, msg);
 catch (XMPPException xe) 
    msg = "XMPPException login(): " + xe.getMessage();
    Log.v(LOG_TAG, msg);

    StackTraceElement[] st = xe.getStackTrace();
    for (int i = 0; i<st.length; i++)  
        msg = xe.getStackTrace()[i].toString();
        Log.v(LOG_TAG, msg);
    


// creating a chat and sending messages
try 
     ChatManager chatmanager = conn1.getChatManager();
     msg = "creating chat";
     Log.v(LOG_TAG, msg);
     Chat chat = chatmanager.createChat(BUDDY_ADDRESS, new MessageListener() 

        @Override
        public void processMessage(Chat chat, Message message) 
            String msg = "incoming chat: " + message;
            Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG);
            Log.v(LOG_TAG, msg);
        
    );
    chat.sendMessage("ahoj");
 catch (XMPPException xe) 
    msg = "XMPPException during connect(): " + xe.getMessage();
    Log.v(LOG_TAG, msg);

(请忽略我愚蠢的异常处理,我还在学习它:-) connect() 方法应该可以工作,因为它不会抛出异常,在 Logcat 中,在“XMPP 已连接”消息之前,出现错误,然后 login() 方法抛出异常:

03-01 15:13:19.970: WARN/System.err(4465): stream:error (text)
03-01 15:13:19.970: WARN/System.err(4465):     at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:261)
03-01 15:13:19.970: WARN/System.err(4465):     at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:44)
03-01 15:13:19.975: WARN/System.err(4465):     at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:71)
03-01 15:13:24.640: DEBUG/dalvikvm(3089): GC_EXPLICIT freed 610 objects / 39760 bytes in 216ms
03-01 15:13:26.370: DEBUG/NetworkLocationProvider(2020): onDataConnectionStateChanged 3
03-01 15:13:26.380: DEBUG/MobileDataStateTracker(2020): replacing old mInterfaceName (pdp0) with pdp0 for hipri
03-01 15:13:26.395: DEBUG/MobileDataStateTracker(2020): replacing old mInterfaceName (pdp0) with pdp0 for supl
03-01 15:13:26.400: DEBUG/MobileDataStateTracker(2020): default Received state= CONNECTED, old= CONNECTED, reason= (unspecified), apnTypeList= default,supl
03-01 15:13:31.570: DEBUG/dalvikvm(2806): GC_EXPLICIT freed 173 objects / 10752 bytes in 207ms
03-01 15:13:34.550: VERBOSE/Smacktest_01(4465): XMPP connected
03-01 15:13:36.600: DEBUG/dalvikvm(2583): GC_EXPLICIT freed 1551 objects / 87688 bytes in 236ms
03-01 15:13:39.580: VERBOSE/Smacktest_01(4465): XMPPException login(): No response from the server.
03-01 15:13:39.585: VERBOSE/Smacktest_01(4465): org.jivesoftware.smack.NonSASLAuthentication.authenticate(NonSASLAuthentication.java:73)
03-01 15:13:39.605: VERBOSE/Smacktest_01(4465): org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:369)
03-01 15:13:39.605: VERBOSE/Smacktest_01(4465): org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:230)
03-01 15:13:39.620: VERBOSE/Smacktest_01(4465): com.biroalex.smacktest_01.SmackTest_01Service$AsyncXMPPConn.doInBackground(SmackTest_01Service.java:105)
03-01 15:13:39.620: VERBOSE/Smacktest_01(4465): com.biroalex.smacktest_01.SmackTest_01Service$AsyncXMPPConn.doInBackground(SmackTest_01Service.java:1)
03-01 15:13:39.635: VERBOSE/Smacktest_01(4465): android.os.AsyncTask$2.call(AsyncTask.java:185)
03-01 15:13:39.640: VERBOSE/Smacktest_01(4465): java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
03-01 15:13:39.655: VERBOSE/Smacktest_01(4465): java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-01 15:13:39.655: VERBOSE/Smacktest_01(4465): java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
03-01 15:13:39.660: VERBOSE/Smacktest_01(4465): java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
03-01 15:13:39.665: VERBOSE/Smacktest_01(4465): java.lang.Thread.run(Thread.java:1096)
03-01 15:13:39.705: VERBOSE/Smacktest_01(4465): creating chat

所以问题是 :) 如果我做错了什么,或者项目没有为 aSmack 库在 android 上成为用户做好适当的准备?

在 aSmack 作者的 github https://github.com/rtreffer/asmack 中,他提到了构建环境,这对我来说完全是中文的。我要创建一个新的构建环境吗?我该怎么做?

感谢您的耐心等待!

【问题讨论】:

对于其他人:如果您加入房间两次,您也可以获得stream:error (text),请参阅:community.igniterealtime.org/thread/35991 【参考方案1】:

IIRC 如果您想使用带有 smack 的 gtalk,您必须提供完整的 JID 作为用户名:user@gmail.com

【讨论】:

【参考方案2】:

Google Talk 似乎只在投票模式下工作:http://credentiality2.blogspot.com/2010/03/xmpp-asmack-android-google-talk.html

【讨论】:

谢谢,会尽快尝试 现在我能够检查链接,似乎该解决方案仅在接收聊天消息的方式上有所不同。连接和登录的方式与我相同,并且我的项目在登录时已经失败 - 可能,连接过程中也可能出现问题。 另一方面,在另一台服务器上尝试整个 XMPP 是个好主意,也许 google 对 gtalk 做了一些专有修改。【参考方案3】:

似乎我的代码可以与其他开放的 XMPP 提供程序一起使用,所以我的代码中可能没有严重错误,也没有我的构建环境或其他任何东西,而且很可能不在 aSmack 库中:) 我将尝试了解尝试连接到 google 时会发生什么,但问题目前无效。

【讨论】:

【参考方案4】:

我看到了这个问题并找到了答案,或者当我得到这个异常时,至少找到了一个对我有用的答案。当您创建连接时,请这样做:

    ConnectionConfiguration config = new ConnectionConfiguration(SERVER_HOST, SERVER_PORT);
    config.setTruststoreType("BKS");

希望对你有帮助:)

【讨论】:

以上是关于aSmack XMPP 库不工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android (2014) 中使用 aSmack XMPP 库实现 facebook 聊天? [关闭]

在 Windows 上构建 asmack

Android 文件传输无法通过 XMPP 和 OpenFire 工作

XMPP 服务连接中断

使用 asmack 更改 XMPP 注册用户密码

ASmack 上的叮当声 - XMPP