在android中使用smack进行群聊中的“服务器无响应”异常

Posted

技术标签:

【中文标题】在android中使用smack进行群聊中的“服务器无响应”异常【英文标题】:"No Response from server" exception in group chat using smack in android 【发布时间】:2015-07-10 14:30:40 【问题描述】:

我正在使用 smack.jar 库。 我曾尝试通过以下代码在 android 中使用 xmpp 实现群聊:

MultiUserChat muc = new MultiUserChat(connection,groupName+"@"+Utils.SERVER_NAME);
    muc.create("nickname1");

    Form form = muc.getConfigurationForm();
    Form submitForm = form.createAnswerForm();
    for (Iterator fields = form.getFields();fields.hasNext();)
      FormField field = (FormField) fields.next();
        if(!FormField.TYPE_HIDDEN.equals(field.getType()) && field.getVariable()!= null)
            submitForm.setDefaultAnswer(field.getVariable());
        
                   
    submitForm.setAnswer("muc#roomconfig_publicroom", true);
    muc.sendConfigurationForm(submitForm);
    muc.join("nickname1");

出现“服务器无响应”等异常。有人知道怎么解决吗?

【问题讨论】:

Utils.SERVER_NAME 的值是多少? openfire 服务器的 IP 地址/主机名。 我找到了解决方案,将 smack.jar 文件替换为 asmack.jar 并将 SmackAndroid.init() 放在代码的开头。 可能是您的域名(服务器名称)错误。您可以发布您正在使用的域(服务器名称)吗? 【参考方案1】:

我遇到了同样的问题,因为我使用的是域名chat.localhost。确保我们在multiUserManager.getMultUserChat("roomName@conference.localhost"); 中有conference 作为子域

同样重要的是使用ProviderManager用于 IQ 和 PacketExtension 目的。

public static void configure(ProviderManager pm) 

    // Private Data Storage

    pm.addIQProvider("query", "jabber:iq:private",
            new PrivateDataManager.PrivateDataIQProvider());

    // Time

    try 

        pm.addIQProvider("query", "jabber:iq:time",
                Class.forName("org.jivesoftware.smackx.packet.Time"));

     catch (ClassNotFoundException e) 

        Log.w("TestClient",
                "Can't load class for org.jivesoftware.smackx.packet.Time");

    

    // Roster Exchange

    pm.addExtensionProvider("x", "jabber:x:roster",
            new RosterExchangeProvider());

    // Message Events

    pm.addExtensionProvider("x", "jabber:x:event",
            new MessageEventProvider());

    // Chat State

    pm.addExtensionProvider("active",
            "http://jabber.org/protocol/chatstates",
            new ChatStateExtension.Provider());

    pm.addExtensionProvider("composing",
            "http://jabber.org/protocol/chatstates",
            new ChatStateExtension.Provider());

    pm.addExtensionProvider("paused",
            "http://jabber.org/protocol/chatstates",
            new ChatStateExtension.Provider());

    pm.addExtensionProvider("inactive",
            "http://jabber.org/protocol/chatstates",
            new ChatStateExtension.Provider());

    pm.addExtensionProvider("gone",
            "http://jabber.org/protocol/chatstates",
            new ChatStateExtension.Provider());

    // Xhtml

    pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im",
            new XHTMLExtensionProvider());

    // Group Chat Invitations

    pm.addExtensionProvider("x", "jabber:x:conference",
            new GroupChatInvitation.Provider());

    // Service Discovery # Items

    pm.addIQProvider("query", "http://jabber.org/protocol/disco#items",
            new DiscoverItemsProvider());

    // Service Discovery # Info

    pm.addIQProvider("query", "http://jabber.org/protocol/disco#info",
            new DiscoverInfoProvider());

    // Data Forms

    pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());

    // MUC User

    pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user",
            new MUCUserProvider());

    // MUC Admin

    pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin",
            new MUCAdminProvider());

    // MUC Owner

    pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner",
            new MUCOwnerProvider());

    // Delayed Delivery

    pm.addExtensionProvider("x", "jabber:x:delay",
            new DelayInformationProvider());

    // Version

    try 

        pm.addIQProvider("query", "jabber:iq:version",
                Class.forName("org.jivesoftware.smackx.packet.Version"));

     catch (ClassNotFoundException e) 

        // Not sure what's happening here.

    

    // VCard

    pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());

    // Offline Message Requests

    pm.addIQProvider("offline", "http://jabber.org/protocol/offline",
            new OfflineMessageRequest.Provider());

    // Offline Message Indicator

    pm.addExtensionProvider("offline",
            "http://jabber.org/protocol/offline",
            new OfflineMessageInfo.Provider());

    // Last Activity

    pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());

    // User Search

    pm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider());

    // SharedGroupsInfo

    pm.addIQProvider("sharedgroup",
            "http://www.jivesoftware.org/protocol/sharedgroup",
            new SharedGroupsInfo.Provider());

    // JEP-33: Extended Stanza Addressing

    pm.addExtensionProvider("addresses",
            "http://jabber.org/protocol/address",
            new MultipleAddressesProvider());

    // FileTransfer

    pm.addIQProvider("si", "http://jabber.org/protocol/si",
            new StreamInitiationProvider());

    pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams",
            new BytestreamsProvider());

    pm.addIQProvider("open", "http://jabber.org/protocol/ibb",
            new IBBProviders.Open());

    pm.addIQProvider("close", "http://jabber.org/protocol/ibb",
            new IBBProviders.Close());

    pm.addExtensionProvider("data", "http://jabber.org/protocol/ibb",
            new IBBProviders.Data());

    // Privacy

    pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());

    pm.addIQProvider("command", "http://jabber.org/protocol/commands",
            new AdHocCommandDataProvider());

    pm.addExtensionProvider("malformed-action",
            "http://jabber.org/protocol/commands",
            new AdHocCommandDataProvider.MalformedActionError());

    pm.addExtensionProvider("bad-locale",
            "http://jabber.org/protocol/commands",
            new AdHocCommandDataProvider.BadLocaleError());

    pm.addExtensionProvider("bad-payload",
            "http://jabber.org/protocol/commands",
            new AdHocCommandDataProvider.BadPayloadError());

    pm.addExtensionProvider("bad-sessionid",
            "http://jabber.org/protocol/commands",
            new AdHocCommandDataProvider.BadSessionIDError());

    pm.addExtensionProvider("session-expired",
            "http://jabber.org/protocol/commands",
            new AdHocCommandDataProvider.SessionExpiredError());


【讨论】:

以上是关于在android中使用smack进行群聊中的“服务器无响应”异常的主要内容,如果未能解决你的问题,请参考以下文章

在 xmpp 群聊中发送聊天标记

如何像在 iMessage 群聊中一样在导航栏中放置集合视图

如何使用电报机器人 api 在群聊中接收消息

Android Smack MUC 400 错误请求发送群聊消息

使用 smack 的多用户聊天没有收到消息侦听器

使用 asmack 在群聊中发送后收到多条消息