Android Smack 在加入 MultiUserChat 时出现超时异常
Android Smack giving timeoutexception when joining MultiUserChat
我正尝试在 Android 上使用 Smack 加入 MultiUserChat。目前我可以完美地进行一对一聊天,并且我已连接到服务器,正如我在线显示的那样。我遵循了提供的示例 here。
我有以下代码加入一个MultiUserChat
(MUC)。
final XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
.setUsernameAndPassword(user.getUsername(), user.getJabberPassword())
.setServiceName("app.buur.nu")
.setHost("app.buur.nu")
.setPort(5222)
.build();
AbstractXMPPConnection connection = new XMPPTCPConnection(config);
String room = "testroom";
MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection);
MultiUserChat muc = manager.getMultiUserChat(room + "@groups.app.buur.nu");
try {
muc.join(user.getUsername(), null, null, connection.getPacketReplyTimeout());
} catch (SmackException.NoResponseException e) {
e.printStackTrace();
} catch (XMPPException.XMPPErrorException e) {
e.printStackTrace();
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
但这给了我
org.jivesoftware.smack.SmackException$NoResponseException: No response received within reply timeout. Timeout was 5000ms (~5s). Used filter: AndFilter: (FromMatchesFilter (full): testroom@groups.app.buur.nu/test, StanzaTypeFilter: org.jivesoftware.smack.packet.Presence).
我尝试将超时增加到 10000 毫秒,但我仍然遇到超时。这里有什么问题?创建一对一聊天效果很好 connection.isConnected())
returns True...
原来我报错了
<presence to="app.buur.nu/7c65be6" id="lgcSp-4" type="error"><x xmlns="http://jabber.org/protocol/muc"/><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="os2Kusj3WEOivn5n4iFr/ZEO8ls="/><error code="401" type="auth"><not-authorized xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></presence>
基本上,我在尝试加入房间时未完成身份验证。身份验证完成后是否可以添加侦听器以接收更新?我看到了 https://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smack/SASLAuthentication.html#authenticate%28java.lang.String,%20javax.security.auth.callback.CallbackHandler%29 但实现我自己的身份验证机制似乎有点矫枉过正...
没有onAuthenticationCompletedListener
什么的吗?
原来没有必要实现SASL机制,可以这样做:
connection.addConnectionListener(new ConnectionListener() {
@Override
public void connected(XMPPConnection connection) {
}
@Override
public void authenticated(XMPPConnection connection, boolean resumed) {
joinMUCRooms();
}
@Override
public void connectionClosed() {
}
@Override
public void connectionClosedOnError(Exception e) {
}
@Override
public void reconnectionSuccessful() {
}
@Override
public void reconnectingIn(int seconds) {
}
@Override
public void reconnectionFailed(Exception e) {
}
});
错误现在不再显示,同时保持代码 "fairly" 干净。
房间存在吗?如果没有,那么您需要先创建它,使用 create()
并发送即时表格。您还应该向 openfire 开发人员报告 MUC 错误存在缺少 'from' 属性。
我正尝试在 Android 上使用 Smack 加入 MultiUserChat。目前我可以完美地进行一对一聊天,并且我已连接到服务器,正如我在线显示的那样。我遵循了提供的示例 here。
我有以下代码加入一个MultiUserChat
(MUC)。
final XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
.setUsernameAndPassword(user.getUsername(), user.getJabberPassword())
.setServiceName("app.buur.nu")
.setHost("app.buur.nu")
.setPort(5222)
.build();
AbstractXMPPConnection connection = new XMPPTCPConnection(config);
String room = "testroom";
MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection);
MultiUserChat muc = manager.getMultiUserChat(room + "@groups.app.buur.nu");
try {
muc.join(user.getUsername(), null, null, connection.getPacketReplyTimeout());
} catch (SmackException.NoResponseException e) {
e.printStackTrace();
} catch (XMPPException.XMPPErrorException e) {
e.printStackTrace();
} catch (SmackException.NotConnectedException e) {
e.printStackTrace();
}
但这给了我
org.jivesoftware.smack.SmackException$NoResponseException: No response received within reply timeout. Timeout was 5000ms (~5s). Used filter: AndFilter: (FromMatchesFilter (full): testroom@groups.app.buur.nu/test, StanzaTypeFilter: org.jivesoftware.smack.packet.Presence).
我尝试将超时增加到 10000 毫秒,但我仍然遇到超时。这里有什么问题?创建一对一聊天效果很好 connection.isConnected())
returns True...
原来我报错了
<presence to="app.buur.nu/7c65be6" id="lgcSp-4" type="error"><x xmlns="http://jabber.org/protocol/muc"/><c xmlns="http://jabber.org/protocol/caps" hash="sha-1" node="http://www.igniterealtime.org/projects/smack" ver="os2Kusj3WEOivn5n4iFr/ZEO8ls="/><error code="401" type="auth"><not-authorized xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></presence>
基本上,我在尝试加入房间时未完成身份验证。身份验证完成后是否可以添加侦听器以接收更新?我看到了 https://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smack/SASLAuthentication.html#authenticate%28java.lang.String,%20javax.security.auth.callback.CallbackHandler%29 但实现我自己的身份验证机制似乎有点矫枉过正...
没有onAuthenticationCompletedListener
什么的吗?
原来没有必要实现SASL机制,可以这样做:
connection.addConnectionListener(new ConnectionListener() {
@Override
public void connected(XMPPConnection connection) {
}
@Override
public void authenticated(XMPPConnection connection, boolean resumed) {
joinMUCRooms();
}
@Override
public void connectionClosed() {
}
@Override
public void connectionClosedOnError(Exception e) {
}
@Override
public void reconnectionSuccessful() {
}
@Override
public void reconnectingIn(int seconds) {
}
@Override
public void reconnectionFailed(Exception e) {
}
});
错误现在不再显示,同时保持代码 "fairly" 干净。
房间存在吗?如果没有,那么您需要先创建它,使用 create()
并发送即时表格。您还应该向 openfire 开发人员报告 MUC 错误存在缺少 'from' 属性。