gpt4 book ai didi

android - XMPP Smack - 消息被修改

转载 作者:行者123 更新时间:2023-11-29 00:18:57 24 4
gpt4 key购买 nike

我正在开发一个基于xmpp(smack+openfire)的聊天系统。当我尝试连同普通消息一起发送一些“额外数据”时,我遇到了问题。在准备消息时,我执行以下操作:

MyData myObject = new MyData("some text");

Message msg = new Message("a@me", Message.Type.chat);

DefaultPacketExtension dpe = new DefaultPacketExtension("packetName", "http://namespace.stuff");
dpe.setValue("dataTag", myObject.toXMLString());

msg.addExtension(dpe);
msg.setBody("Hello World!");

myObject.toXmlString() 返回 MyData 对象的 XML 表示(使用 dom4j)。在此之后,我继续发送此消息:

Chat personalChat = chatmanager.createChat(msg.getTo(),new MessageListener() {
@Override
public void processMessage(Chat chat, Message message) {
System.out.println("MESSAGE RECEIVED:");
System.out.println("From: "+message.getFrom());
System.out.println(message);
}
});

personalChat.sendMessage(msg);

调试客户端报告以下消息。

外出留言:

<message id="Fx5bQ-4" to="a@me" from="a@me/Smack" type="chat">
<body>Hello World!</body>
<thread>ef9632e3-6d27-4fea-a5c8-b3f7c85052d8</thread>
<packetName xmlns="http://namespace.stuff">
<dataTag>
<myData xmlns:me="namespace">
<name>some text</name>
<points>0</points>
<res>0</res>
<contract/>
<bonuses/>
<position>0</position>
<secret/>
</myData>
</dataTag>
</packetName>
</message>

在消息中:

<message id="Fx5bQ-4" to="a@me" from="a@me/Smack" type="chat">
<body>Hello World!</body>
<thread>ef9632e3-6d27-4fea-a5c8-b3f7c85052d8</thread>
<packetName xmlns="http://namespace.stuff">
<bonuses/>
<name>some text</name>
<res>0</res>
<contract/>
<position>0</position>
<secret/>
<points>0</points>
</packetName>
</message>

如您所见,一些数据“丢失”了。事实上,“dataTag”和“myData”只是作为传出消息的一部分记录下来,但不会出现在传入消息中!这意味着(性能问题......“无用”发送“空”节点)还是 openfire 设置有问题?

这只是一个小例子……在实际项目中,我在传出消息和传入消息中有 1000 多行“myData”对象,其中大部分都丢失了(比如 90% 的 packetExtension 丢失了,并且不仅仅是 xml 的“空”节点)!

最佳答案

原因是您缺少特定的 packetExtensionProvider因此,当您的数据包到达时,DefaultPacketExtensionProvider 无法正确解析它。事实上,这个 DefaultPacketExtensionProvider 非常简单,只能解析具有 1 级左右子级的简单 XML。

对于您的情况,您需要定义如下内容:

class MyExtensionProvider implements PacketExtensionProvider{
@Override
public PacketExtension parseExtension(XmlPullParser parser)throws Exception {
LOGGER.info("[parseExtension] Executing parseExtension()");

DefaultPacketExtension extension = new DefaultPacketExtension(MyExtension.ELEMENT_NAME,MyExtension.NAMESPACE);

boolean done = false;

int eventType = parser.getEventType();

while (!done) {
System.out.println(parser.getText());

if (eventType == XmlPullParser.START_TAG) {

String name = parser.getName();
System.out.println(name);

// If an empty element, set the value with the empty string.
if (parser.isEmptyElementTag()) {
extension.setValue(name,"");
}else {
eventType = parser.next();
if (eventType == XmlPullParser.TEXT) {
String value = parser.getText();
System.out.println(value);
extension.setValue(name, value);
done=true;
}
}
}

eventType = parser.next();
}
return extension;
}
}

这是一个简单的,因此您想定义自己的。然后你需要注册你的供应商:

ProviderManager providerManager = ProviderManager.getInstance();     
providerManager.addExtensionProvider(MyExtension.ELEMENT_NAME, MyExtension.NAMESPACE,new MyExtensionProvider());

请记住:当您发送消息时,它必须正确设置 MyExtension.ELEMENT_NAMEMyExtension.NAMESPACE 否则它将无法工作。 ProviderManager 将无法识别数据包,也不会调用正确的 PacketExtensionProvider

关于android - XMPP Smack - 消息被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24371609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com