openfire本身有很多比较好的实现框架,如asmack和smack。具体的大家可以上网搜索。因为openfire本身对长连接的支持不是很好,而且相对来说,长连接也挺消耗资源的,但是,又要必须做到及时响应。
这就存在了一些特殊的账户要存在在服务器中。这些账户能实现自动添加好友,自动响应消息和消息回执响应,而消息回执的响应和请求在smack端有很好的封装,而我服务端也按照其xml请求和响应,如下:
- PacketExtension packetExtension2 = new PacketExtension(DeliveryReceipt.ELEMENT,DeliveryReceipt.NAMESPACE);
- // 将消息id返回给发送信息用户 表明已经接收到
- packetExtension2.getElement().addAttribute("id", message.getID());
- // 回执请求设置
- responseMessage.addExtension(packetExtension2);
- XMPPServer.getInstance().getRoutingTable().routePacket(message.getFrom(), responseMessage, true);
而消息回执的响应相对来说复杂一点,如下:
- private static Message packMessageProperty(Message requestMessage , Map<String, String> propertyValue){
-
- String key = null;
- String value = null;
- for (Map.Entry<String, String> entry: propertyValue.entrySet()) {
- key = entry.getKey();
- value = entry.getValue();
- }
- Message sendMessage = new Message();
- sendMessage.setFrom(requestMessage.getTo());
- sendMessage.setTo(requestMessage.getFrom());
- sendMessage.setType(org.xmpp.packet.Message.Type.chat);
- // 封装property数据
- PacketExtension packetExtension = new PacketExtension("properties","http://www./xmlns/xmpp/properties");
- Element root = packetExtension.getElement();
- Element propertyElement = root.addElement("property");
- Element nameElement = propertyElement.addElement("name");
- Element valueElement = propertyElement.addElement("value");
- nameElement.setText(key);
- valueElement.addAttribute("type", "string");
- valueElement.setText(value);
- sendMessage.addExtension(packetExtension);
- return sendMessage;
- }
设置消息回执主要原因有以下几条:
1.查看消息是否发送成功,方便再次发送
2.统计openfire消息的送达率
3.弥补openfire丢包的风险等
|