实现功能:
对用户发送消息,如果在线就直接发送,不在线时存为离线消息
对组发送消息,如果在线就直接发送,不在线时存为离线消息
以下是插件配置:
说明参考:http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/plugin-dev-guide.html
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<class>org.jivesoftware.openfire.plugin.Msger</class>
<name>${msger.plugin.name}</name>
<description>${msger.plugin.description}</description>
<author>leon</author>
<version>1.0.0</version>
<date>2/20/2009</date>
<url>http://hi.baidu.com/jyleon</url>
<minServerVersion>3.6.3</minServerVersion>
<adminconsole>
<tab id="tab-session">
<sidebar id="sidebar-tools" description="${msger.sidebar.name}">
<item id="msger-send" name="${msger.sendToUser}" description="${msger.sendToUser.title}" url="msger-send.jsp"/>
<item id="msger-sendGroup" name="${msger.sendToGroup}" description="${msger.sendToGroup.title}" url="msger-sendGroup.jsp"/>
</sidebar>
</tab>
</adminconsole>
</plugin>
要注意的是:
1、<sidebar id="sidebar-tools" description="${msger.sidebar.name}">
id="sidebar-tools" 是把这个插件放到openfire导航的“会话”的“工具”下面。(openfire导航标签参考admin-sidebar.xml ),${msger.sidebar.name} 国际化设置,如果不设置的话,只能用英文
2、 <item id="msger-send" name="${msger.sendToUser}" description="${msger.sendToUser.title}" url="msger-send.jsp"/>
功能是新加一个连接“对用户发送消息”,连接到msger-send.jsp
注意:openfire使用的是:Sitemesh 页面装饰框架,插件标签中定义 id="msger-send" ,那么msger- send.jsp 必须要在head里添加:<meta name="pageID" content="msger-send"/>,否则将无法正常显示。
3、 <minServerVersion>3.6.3</minServerVersion> 插件定义openfire服务的版本,不能上传低于3.6.3的版本。如低于3.6.3,将此处改成与 openfire 对应的版本号即可。
4. jsp 代码 msger-send.jsp
<%@page import="org.jivesoftware.openfire.XMPPServer"%>
<%@ page import="java.util.*" %>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/style/global.css">
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<title><fmt:message key="msger.sendToUser.title"/></title>
<meta name="pageID" content="msger-send"/>
</head>
<jsp:useBean id="webManager" class="org.jivesoftware.util.WebManager" />
<body>
<%@ page import="org.jivesoftware.openfire.PresenceManager,
org.jivesoftware.openfire.group.Group,
org.jivesoftware.openfire.group.GroupManager,
org.jivesoftware.openfire.user.User,
org.jivesoftware.openfire.user.UserManager,
org.jivesoftware.openfire.user.UserNotFoundException,
org.jivesoftware.util.ParamUtils,
org.jivesoftware.openfire.SessionManager,
org.xmpp.packet.JID,
org.xmpp.packet.Message,
java.util.Collection"
errorPage="error.jsp"
%>
<%
boolean send = ParamUtils.getBooleanParameter(request,"send");
String toUser = ParamUtils.getParameter(request,"toUser");
String fromUser = ParamUtils.getParameter(request,"fromUser");
String message = ParamUtils.getParameter(request,"message");
String success=null;
if (send) {
//send to user
SessionManager sessionManager = webManager.getSessionManager();
PresenceManager presenceManager = webManager.getPresenceManager();
UserManager userManager = webManager.getUserManager();
String serverDomainName =XMPPServer.getInstance().getServerInfo().getXMPPDomain();
User user=null;
JID toUserJid= null;
JID fromUserJid= null;
if(fromUser!=null)
fromUserJid=new JID(fromUser+"@"+serverDomainName);
else
fromUserJid=new JID("admin@"+serverDomainName);
if(toUser!=null&&message!=null&&userManager.isRegisteredUser(toUser)==true){
try {
user = userManager.getUser(toUser);
if (presenceManager.isAvailable(user)) {
// online messages
toUserJid = presenceManager.getPresence(user).getFrom();
sessionManager.sendServerMessage(toUserJid , null, message);
success="true";
}else{
// offline message
toUserJid =new JID(toUser+"@"+serverDomainName);
if(toUserJid!=null){
Message msg = new Message();
msg.setBody(message);
msg.setTo(toUserJid);
msg.setFrom(fromUserJid);
XMPPServer.getInstance().getOfflineMessageStrategy().storeOffline(msg);
}
success="true";
}
}
catch (UserNotFoundException e) {
success="fail";
e.printStackTrace();
}
}else{
success="fail";
}
}
%>
<% if (success=="true") { %>
<div class="jive-success">
<table cellpadding="0" cellspacing="0" border="0">
<tbody>
<tr><td class="jive-icon"><img src="images/success-16x16.gif" width="16" height="16" border="0" alt=""></td>
<td class="jive-icon-label">
<fmt:message key="msger.sendReault.success" />
</td></tr>
</tbody>
</table>
</div><br>
<% }if(success=="fail"){ %>
<div class="jive-success">
<table cellpadding="0" cellspacing="0" border="0">
<tbody>
<tr><td class="jive-icon"><img src="images/error-16x16.gif" width="16" height="16" border="0" alt=""></td>
<td class="jive-icon-label">
<fmt:message key="msger.sendReault.fail" />! <fmt:message key="msger.sendReault.fail.nouser" /> , <fmt:message key="msger.sendReault.fail.noContent" />
</td></tr>
</tbody>
</table>
</div><br>
<%}%>
<table cellpadding="3">
<form action="msger-send.jsp" id="sendMsg" method="post">
<tr>
<td><fmt:message key="msger.sendToUser"/></td>
<td><input type="text" name="toUser" id="toUser"></td>
</tr>
<tr>
<td> <fmt:message key="msger.sendContent"/></td>
<td><textarea rows="10" name="message" cols="60"></textarea></td>
<tr>
<td></td>
<td>
<input type="submit" value="<fmt:message key="msger.send.submit"/>"><input type="hidden" name="send" value="true">
</td>
</tr>
</form>
</table>
</body>
</html>
openfire的插件开发,是一件很有意思的事情,这只是在初期学的时候的一些总结和经验,适合新手。希望更多的人参与进来,大家共同研究。
群:28588322
插件下载:发送消息插件
http://hi.baidu.com/jyleon/blog/item/5a6627dd7fc4dbd18d1029bf.html
分享到:
相关推荐
**Openfire、Red5与SparkWeb插件** Openfire是一款开源的即时通讯(IM)服务器,基于XMPP协议,提供实时、双向通信服务。它使用Java编写,易于部署和管理,支持多种客户端,包括Web、桌面应用等。Openfire的核心...
本文将深入探讨“Openfire消息回执插件”,并结合提供的三个关键文件——DbChatLogsManager.java、ChatLogPlugin.java和ChatLogs.java,解析该插件的设计与实现。 1. 消息回执机制: 消息回执是即时通讯中的一种...
在实时通信中,丢包问题常常是影响用户体验的重要因素,为此,开发者们设计了一款专门针对Openfire的防丢包插件,以确保消息的完整性和可靠性。本文将详细介绍该防丢包插件的工作原理,并对源码进行深入解析。 首先...
这个"openfire聊天记录插件源码包"包含了实现聊天记录存储和查询功能的相关代码,这对于开发者来说是一个宝贵的资源,可以深入理解聊天记录的处理机制,并且可以根据需求进行定制化开发。 首先,我们要了解XMPP...
5. **使用Openfire API**:Openfire提供了丰富的API供插件开发者使用,例如,你可以通过`AdminManager`来管理用户和群组,或者通过`PacketRouter`来发送和接收XMPP消息。理解并熟练运用这些API是开发高效插件的关键...
Openfire的核心功能主要包括连接管理、消息解析、消息路由与消息发送。 #### 二、Openfire架构 ##### 2.1 框架结构 Openfire的整体架构主要由多个模块(Module)构成,这些模块实现了Openfire的核心功能。模块的...
例如,`xmpp-server`模块包含了处理连接、认证、会话管理和消息路由的类。通过解析XML流,Openfire可以理解客户端的需求,如登录、发送消息或建立多用户聊天室。 三、源码关键模块分析 1. 用户管理:`user`模块是...
4. **路由与传输**:在XMPP中,路由和传输层负责处理消息的发送和接收。Openfire使用Smack库处理XMPP协议,实现数据包的解析、编码和转发。 5. **群组与房间管理**:Openfire支持多用户聊天(MUC)功能,用户可以...
在Openfire中,开发者可能需要处理用户离线时的消息存储和发送,这涉及到对Openfire的离线消息API的深入理解和使用。 综上所述,Openfire插件开发涵盖了一系列技术点,包括对XMPP协议的理解,Java编程技能,Maven...
实际开发中,可以通过创建Android示例项目,实现注册、登录、发送和接收消息等功能,逐步理解Openfire和XMPP的结合使用。同时,可以参考Openfire的官方文档和社区资源,解决遇到的问题。 总之,Openfire和XMPP协议...
源码中的`plugins`目录包含了默认的插件源码,学习这部分可以了解如何开发新的插件。 9. **日志和监控**:Openfire使用Log4j进行日志记录,并且有监控服务器性能的机制。源码中会有相关配置和实现。 10. **国际化...
在本案例中,“Openfire JSP Plugin 开发源码”显然是一份关于如何开发Openfire平台上的JSP插件的源代码,可能包含了用于Android、iPhone和iPad设备的接口,特别地,这个插件实现了对TVBox终端的管理和控制。...
"openfire记录在线统计人数插件"就是这样一个工具,它能够帮助管理员实时监控和记录系统中的在线用户数量,对于系统管理和运营分析具有重要意义。 在线统计人数插件的主要功能包括: 1. **实时在线用户统计**:...
该模块实现的功能和broadcast(广播)插件类似,都允许服务器向所有或特定用户发送消息。Broadcast插件实际上是XMPP协议中的广播消息,它使用了特殊的XML命名空间。broadcast源码插件用于加载控制用户广播信息权限的...
"openfire处理消息流程,及openfire详细信息.doc"和"openfire消息、监听、启动流程分析.docx"详细解释了Openfire的消息处理流程,包括连接建立、消息发送、接收和监听等环节。理解这些流程有助于优化性能和调试问题。...
4. **发送消息**:创建`Message`对象,设置目标JID(用户名@服务器名)和消息内容,然后使用`connection.sendStanza()`发送。 ```java Message message = new Message("recipient@your-openfire-server.com", ...
本文针对使用Openfire服务器进行二次开发时可能遇到的问题,结合实际需求,提出了一系列解决方案,并着重介绍了Openfire服务器插件开发和源码修改等方面的设计与实现。 #### 二、Openfire插件开发问题分析与解决 #...
REST API插件自述文件REST API插件通过向服务器发送REST / HTTP请求来提供管理Openfire的能力。 该插件的功能对于需要在Openfire管理控制台之外管理Openfire的应用程序很有用。功能清单获取所有或特定用户的概述,并...