【问题标题】:XMPP Smack - Message Being ModifiedXMPP Smack - 消息被修改
【发布时间】:2014-06-23 17:15:09
【问题描述】:

我正在开发一个基于 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 的“空”节点)!

【问题讨论】:

  • 您使用的是什么服务器?这是您正在使用的实际 XML,还是尝试生成示例?例如,您的 xmlns:me 命名空间声明实际上并未被使用。

标签: android xmpp openfire smack


【解决方案1】:

原因是您缺少特定的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

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2016-10-26
    • 2011-04-18
    • 2011-06-27
    • 2016-10-20
    相关资源
    最近更新 更多