创建 MultiUserChat 时出现 NoResponseException

Posted

技术标签:

【中文标题】创建 MultiUserChat 时出现 NoResponseException【英文标题】:Getting NoResponseException while creating MultiUserChat 【发布时间】:2016-06-15 10:45:08 【问题描述】:

我正在尝试使用 XMPP Smack Api(4.1.4) 创建多用户聊天。我已经建立了一个登录连接,

XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
    configBuilder.setResource(RESOURCE);
    configBuilder.setServiceName(DOMAIN);
    configBuilder.setHost(HOST);
    XMPPTCPConnection connection = new XMPPTCPConnection(configBuilder.build());
    connection.addConnectionListener(connectionListener);

AsyncTask<Void, Void, Boolean> connectionThread = new AsyncTask<Void, Void, Boolean>() 
        @Override
        protected Boolean doInBackground(Void... arg0) 
            try 
                connection.connect();
                if(connection != null) 
                PingManager mPingManager = PingManager.getInstanceFor(connection);
                mPingManager.setDefaultPingInterval(1000 * 50);
                mPingManager.setPingInterval(1000 * 50);
                connection.setPacketReplyTimeout(1000 * 50);
                mPingManager.registerPingFailedListener(new PingFailedListener() 
                @Override
                public void pingFailed() 
                    // TODO Auto-generated method stub
                    Log.e("PING", "ping failed");
                    // AGain Reconnecting code here..
            
        );
    
             catch (IOException | SmackException | XMPPException e) 
                Log.d(LOCAL_TAG, "connectConnection  exc: "+e.getMessage());
            
            return null;
        
    ;
    connectionThread.execute();

它已成功连接。连接后,我正在尝试使用创建群聊,

    try 
        SharedPreferences mPreferences = context.getSharedPreferences("App_Pref", Context.MODE_PRIVATE);
        String userJid = userJidAddress(with local ip);
        String userName =  "Test5";
        Log.d(LOCAL_TAG, "createGroupChat  jid: "+userJid+" -- connection.getServiceName(): "+connection.getServiceName());

        MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection);
        MultiUserChat muc = manager.getMultiUserChat(userJid);

        muc.create("InstantRoom");

        Log.d(LOCAL_TAG, "createGroupChat  -- Group CEATED Successfully ");
        Form form = muc.getConfigurationForm();
        Form submitForm = form.createAnswerForm();

        List<FormField> fields = form.getFields();
        Log.d(LOCAL_TAG, "createGroupChat  -- fields.size(): "+fields.size());
        for (int i = 0; i < fields.size(); i++) 
            FormField field = (FormField) fields.get(i);
            if (!FormField.Type.hidden.equals(field.getType()) && field.getVariable() != null) 
                submitForm.setDefaultAnswer(field.getVariable());
            
        

        List owners = new ArrayList();
        owners.add("test5"+connection.getServiceName());
        owners.add("test7"); //Another user
        submitForm.setAnswer("muc#roomconfig_roomowners", owners);
        submitForm.setAnswer("muc#roomconfig_persistentroom", true);
        muc.sendConfigurationForm(submitForm);
        muc.join("InstantRoom");

    
    catch(Exception e)
        Log.d(LOCAL_TAG, "createGroupChat --  Exception: "+e.toString());
    

但是在创建组时,我得到一个例外

    "org.jivesoftware.smack.SmackException$NoResponseException: No response received within reply timeout. Timeout was 50000ms (~50s). Used filter: AndFilter: (FromMatchesFilter (full): test5@172.21.4.199/instantroom, StanzaTypeFilter: org.jivesoftware.smack.packet.Presence)." 

如果我增加 PingIntervals 和 PacketReplyTimeout 毫秒,那么我会收到一条消息

"Thread[5,tid=4403,WaitingInMainSignalCatcherLoop,Thread*=0xb8e933a8,peer=0x12c000a0,"Signal Catcher"]:对信号 3 做出反应。

没有该例外,应用程序设置为自动强制关闭。希望如此,我在 muc.create("InstantRoom") 行收到异常,因为我无法在该行之后获取日志。 任何人都可以通过找出我做错了什么以及为什么我收到此错误以及在此之后如何继续来帮助我。提前致谢。

【问题讨论】:

好吧,发布你的代码(使用 muc.create() );) @MrPk 您好,感谢您的回复。我已经编辑了我的代码,请检查它并给我一些建议。 【参考方案1】:

这两行是错误的

 MultiUserChat muc = manager.getMultiUserChat(userJid);

        muc.create("InstantRoom");

当您获得 MUC 时,您必须获得一个 NAME(以便经理可以告诉您是否已经存在)。

确实,当您创建 muc 时,您必须输入用户名。

所以

String myMUCName = "InstantRoom";
String myMUCService = "conference.myServer";
String myMUCfullName = myMUCName + "@" + myMUCService;
MultiUserChat muc = manager.getMultiUserChat(myMUCfullName);
muc.create(userName);

(如果这不能解决您的问题,请在确保服务已在服务器上注册后告诉我 - 也许您在表单上会有额外的问题)

【讨论】:

嗨.. 非常感谢您的建议。这解决了该错误。但是我没有使用“conference.myServer”作为 myMUCService,而是使用了“conference.(my local ip)”,因为我得到了服务器也没有发现错误。但是在解决这个问题之后,我得到了另一个异常“org.jivesoftware.smack.XMPPException$XMPPErrorException:XMPPError:forbidden - auth”。我已将成员添加为 owner.add("test5"); //自己的用户owners.add("test7"); //另一个用户,希望我在“muc.sendConfigurationForm(submitForm);”处得到异常线。因为,如果我把它放在那个代码下面,我就无法得到日志。请建议我任何想法。 嗨..我已经通过更改“muc.sendConfigurationForm(submitForm);”修复了该异常代码为“muc.sendConfigurationForm(new Form(DataForm.Type.submit));”。像这样更改后,我没有得到任何异常,最后打印了“加入组”日志。但我确实知道我为该组选择的用户是如何添加的。我不确定这样做是否正确。请建议我如何进行。 请接受答案,然后打开一个新问题(请随时将新问题链接给我),太多的事情需要解释才能发表评论。当然,'myserver' 是一个占位符,干得好 =) 抱歉耽搁了

以上是关于创建 MultiUserChat 时出现 NoResponseException的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Smack 创建 MultiUserChat:接收 SmackException$NoResponseException:在回复中未收到响应

MultiUserChat 发送和接收消息错误

XMPP Android - 无法创建 MultiUserChat

为 MultiUserChat 添加监听器 (aSmack)

如何使用 aSmack 获取 MultiUserChat 房间的 DiscussionHistory?

当有人在 smackx 中加入或离开 MultiUserChat 时,如何找出房间的入住者?