我有这个Android应用程序,我一直在尝试设置XMPP MultiUserChat。
就连接到XMPP而言,登录和创建MUC(以及加入已经创建的MUC)一切都没问题。
我似乎无法正确收听发送的消息,我不知道为什么。
之前我曾使用Javascript(StropheJS和Bosh)在XMPP上工作过几次,所以我对它的协议有点熟悉。
我已经尝试过以下帖子(我发现的唯一一篇关于此事的帖子)的建议:
How to properly listen for MultiUserChat in Smack?
所以,我已经决定问你一些指示,因为我认为这可能仅仅是我一直缺少的设置。
所以,为了简单起见,我将提供我的整个序列。
我创建了一个服务,因此我的XMPP连接可以在整个应用程序中普遍存在。因为我需要在我的应用程序登录后立即连接到XMPP,并且MUC会议室将仅在其他活动中进一步使用。好吧,你明白了。所以,这是代码:
(对不起,如果它有点太长,我不是故意要烦,我想要的只是提供一切都需要才能解决它)
//everything is alright here.
//it's connecting correctly to XMPP
public void connect()
{
Thread t = new Thread(new Runnable() {
@Override
public void run()
{
boolean flConnected = false;
System.setProperty("smack.debugEnabled", "true");
SmackConfiguration.setDefaultPacketReplyTimeout(10000);
ConnectionConfiguration ConnectionConfiguration = new ConnectionConfiguration(Host, Port);
ConnectionConfiguration.setSecurityMode(org.jivesoftware.smack.ConnectionConfiguration.SecurityMode.disabled);
ConnectionConfiguration.setDebuggerEnabled(true);
ConnectionConfiguration.setSendPresence(true);
connection = new XMPPTCPConnection(ConnectionConfiguration);
try
{
connection.connect();
login();
}
//there are many exceptions being treated, I
//suppressed them here for simplicity's sake
catch (Exception e)
{
Log.e(TAG, "connection exception: " + e.getMessage());
}
}
});
t.start();
}
public void login()
{
try
{
connection.login(this.User, Pwd);
Presence presence = new Presence(Presence.Type.available);
connection.sendPacket(presence);
this.setLoginAttempts();
}
catch (Exception e)
{
Log.e(TAG, "connection exception: "+e.getMessage());
}
}
因此,当用户应该是某个聊天组的管理员时,我创建了传递GroupName(id)的组
public void createGroup(String strRoom)
{
try
{
muc = new MultiUserChat(connection, strRoom+"@"+this.GroupChat);
muc.create(this.User);
Form form = muc.getConfigurationForm();
Form submitForm = form.createAnswerForm();
for (Iterator fields = form.getFields().iterator(); fields.hasNext();) {
FormField field = (FormField) fields.next();
if (!FormField.TYPE_HIDDEN.equals(field.getType())
&& field.getVariable() != null) {
submitForm.setDefaultAnswer(field.getVariable());
}
}
List<String> owners = new ArrayList<>();
owners.add(this.User + "@"+this.Host);
muc.sendConfigurationForm(submitForm);
//here, it's another FAILED attempt of putting the
//listener to an async class. Didn't work at all!!
//just kept it here so you can see my attempts!
//new MessageRunner().execute(connection);
}
catch (Exception ex)
{
Log.e(TAG, " exception :"+ex.getMessage());
}
}
当它只是一个参与者时,它加入了小组:
public void joinGroup(String strRoom)
{
try
{
DiscussionHistory history = new DiscussionHistory();
history.setMaxStanzas(50);
muc = new MultiUserChat(connection, strRoom+"@"+this.GroupChat);
muc.join(strRoom, this.Pwd, history, connection.getPacketReplyTimeout());
this.addMessageListener(muc);
this.listen2Group();
}
catch (Exception ex)
{
Log.e(TAG, "Exception :"+ex.getMessage());
}
}
因此,我使用了3种方法,试图让用户正确地收听收到的消息。
其中一个正在Login:setListener(connection);
之后设置在用户加入GroupChat之后调用另外两个:
addMessageListener(MUC); 和 listen2Group();
我将他们全部留在这里所以你可以看到我走了多远:
private void addMessageListener(MultiUserChat muc)
{
//it's never coming here! never ever!!!
if(null != muc){
muc.addMessageListener(new PacketListener() {
@Override
public void processPacket(Packet packet) {
Log.i("processPacket", "receiving message");
}
});
}
}
private void listen2Group()
{
//also, NEVER EVER getting here at any time!!
PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
connection.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet packet) throws NotConnectedException
{
Message message = (Message) packet;
if (message.getBody() != null)
{
//message should be treated here,
//but I suppressed it as well.
}
}
}, filter);
}
public void setListener(XMPPConnection cnx)
{
this.connection = cnx;
if (connection != null) {
PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
connection.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet packet) {
Message message = (Message) packet;
if (message.getBody() != null)
{
//message will be treated here.
}
}
}, filter);
}
}
以下是我发送消息的方式:
public void sendMessage(String msgText)
{
try
{
Message msg = new Message();
msg.setBody(msgText);
msg.setType(Message.Type.groupchat);
muc.sendMessage(msg);
//I tried sending with this one as well, nope!
//connection.sendPacket(msg);
}
catch(Exception ex)
{
Log.e(TAG, " exception :"+ex.getMessage());
}
}
所以,可能你已经看到我做错了。但是我已经做了好几天了。什么都没有发生!
当我检查我的服务器(openfire)时,所有用户都被设置为在线,正在正确登录到MUC,当发送消息时,没有任何反应!
我把断点放在我给你看的所有听众身上,但无论我做什么,他们都不会开火。消息已发送,但它永远不会到达任何地方。
有什么想法吗?
答案 0 :(得分:0)
对于将来的参考文献(因为当前版本中的版本并未记录在案)
我发现听众出了什么问题!
事实证明我没有将目的地设置为聊天组。
因为它本质上是一个GroupChat,我以为它不需要将接收器设置为消息。
需要一切来修复它,在我的sendMessage方法中,需要额外的一行:
msg.setTo(this.room + “@” + my_service_address);
http://xmpp.org/extensions/xep-0045.html
在XEP-0045中,它声明对于群聊,它必须具有目的地地址才能正常工作。
“在多用户聊天室内发送的消息是特殊类型的”群聊“,并发送到房间本身(房间@服务),然后反映给所有占用者。”