有没有人对XMPP以及openfire spark有研究的

下次自动登录
现在的位置:
& 综合 & 正文
XMPP协议学习笔记五(Openfire消息处理流程)
XMPP协议作为一个IM,其核心在于消息的传递,在Openfire服务器对XMPP的实现中,消息被封装为Packet对象,因此Openfire服务器的核心是对客户端Packet对象的监听和处理流程,我们今天就来研究一下Openfire的消息包接受处理流程。
首先,Openfire服务器需要启动一个基于TCP/IP的监听服务,用以接收客户端传过来的XML流文件。这个过程在XMPPServer类的start()方法中进行,这个监听服务是以loadModule(ConnectionManagerImpl.class.getName())来加载,调用ConnectionManagerImpl类的createClientListeners()方法
private void createClientListeners() {
// Start clients plain socket unless it's been disabled.
if (isClientListenerEnabled()) {
// Create SocketAcceptor with correct number of processors
socketAcceptor = buildSocketAcceptor();
// Customize Executor that will be used by processors to process incoming stanzas
ExecutorThreadModel threadModel = ExecutorThreadModel.getInstance("client");
int eventThreads = JiveGlobals.getIntProperty("xmpp.client.processing.threads", 16);
ThreadPoolExecutor eventExecutor = (ThreadPoolExecutor)threadModel.getExecutor();
eventExecutor.setCorePoolSize(eventThreads + 1);
eventExecutor.setMaximumPoolSize(eventThreads + 1);
eventExecutor.setKeepAliveTime(60, TimeUnit.SECONDS);
socketAcceptor.getDefaultConfig().setThreadModel(threadModel);
// Add the XMPP codec filter
socketAcceptor.getFilterChain().addFirst("xmpp", new ProtocolCodecFilter(new XMPPCodecFactory()));
// Kill sessions whose outgoing queues keep growing and fail to send traffic
socketAcceptor.getFilterChain().addAfter("xmpp", "outCap", new StalledSessionsFilter());
其中的socketAcceptor是在buildSocektAcceptor()方法中定义的,它是作为一个服务端的接收器,是mina框架为我们封装好的一个socketserver,在上面这个方法中,我们为socketAcceptor添加了一个过滤器,XMPPCodeFactory,这个类将过滤xmpp相关请求,加以处理,我们再看同一个类的另外一个方法startClientListener()
private void startClientListeners(String localIPAddress) {
// Start clients plain socket unless it's been disabled.
if (isClientListenerEnabled()) {
int port = getClientListenerPort();
// Listen on a specific network interface if it has been set.
String interfaceName = JiveGlobals.getXMLProperty("network.interface");
InetAddress bindInterface =
if (interfaceName != null) {
if (interfaceName.trim().length() & 0) {
bindInterface = InetAddress.getByName(interfaceName);
// Start accepting connections
socketAcceptor
.bind(new InetSocketAddress(bindInterface, port), new ClientConnectionHandler(serverName));
ports.add(new ServerPort(port, serverName, localIPAddress, false, null, ServerPort.Type.client));
List&String& params = new ArrayList&String&();
params.add(Integer.toString(port));
(LocaleUtils.getLocalizedString("startup.plain", params));
catch (Exception e) {
System.err.println("Error starting XMPP listener on port " + port + ": " +
e.getMessage());
Log.error(LocaleUtils.getLocalizedString("admin.error.socket-setup"), e);
其中的socketAcceptor.bind()方法启动了监听服务器,来监听所有发送到服务器5222端口的数据,并用ClientConnetionHandler类来处理,ClinetConnectionHandler继承于ConnectionHandler类,后者实现了mina的IoHandlerAdaptor接口,其中的messageReceived()方法是关键。
public void messageReceived(IoSession session, Object message) throws Exception {
// Get the stanza handler for this session
StanzaHandler handler = (StanzaHandler) session.getAttribute(HANDLER);
// Get the parser to use to process stanza. For optimization there is going
// to be a parser for each running thread. Each Filter will be executed
// by the Executor placed as the first Filter. So we can have a parser associated
// to each Thread
int hashCode = Thread.currentThread().hashCode();
XMPPPacketReader parser = parsers.get(hashCode);
if (parser == null) {
parser = new XMPPPacketReader();
parser.setXPPFactory(factory);
parsers.put(hashCode, parser);
// Update counter of read btyes
updateReadBytesCounter(session);
//System.out.println("RCVD: " + message);
// Let the stanza handler process the received stanza
handler.process((String) message, parser);
} catch (Exception e) {
Log.error("Closing connection due to error while processing message: " + message, e);
Connection connection = (Connection) session.getAttribute(CONNECTION);
connection.close();
可以看到收到的信息交由StanzaHandler的process方法中进行XML解析并封装为packet对象,然后再进行下一步的处理,至此,从客户端到服务器端的packet传递结束。
&&&&推荐文章:
【上篇】【下篇】xmpp和OpenFire实例,实现即时聊天室,支持离线消息 - 推酷
xmpp和OpenFire实例,实现即时聊天室,支持离线消息
先说一下为什么要写这篇博客,是因为本人在周末在研究XMPP和OpenFire,从网上下载了个Demo,但跑不起来,花了很长时间,经改造后,跑起来了,写个篇博文也是希望后边学习XMPP和OpenFire的同学下载后直接运行,少走弯路了。时间就是金钱,不要花费不必要的时间,也希望大家都能有分享精神!,有问题可以发邮件给我()
关于xmpp和openfire的资料请百度百科一下
以下展示一个聊天程序。所谓万事都要有Helloworld嘛,这个demo可以做为学习xmpp和openfire等的一个开篇HelloWorld,看了代码,也许对对其有更快更好的理解
1. 闲话不多说,先看效果图:(第一张是模拟器的,第二张是真机的,真机和模拟器之间能过OpenFire服务器通信)
2.详细环境搭建和源代码下载如下:
& &1)要下载OpenFire服务器:
& &2)关于OpenFire的安装和配置请参考:
& &3)所有配置完全后要为服务器加入两个用户名(
在本Demo中使用的是test1和test2,密码自己设定,注意:服务器的名字是sam,写错后,对方将收不到消息
& & 4)下载手机侧的源代码我已经上载到CSDN的资源库了(
),可直接运行,可用模拟器和真机测试(如果有真机,需求要局域网,也就是手机可以链接Wifi才可以。
& & 5)大功造成了:可以聊天,还支持离线消息(也就是要发给的对方没有在线,服务器会记录消息,在对方登陆上之后,服务器会把消息发过来)
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见当前位置:
xmpp,openfire通讯工程师
地点:上海-徐汇区地理位置
行业:计算机软件
性质:民营公司
规模:51-200 职员
月薪:面议
1、精通Java语言,熟悉socket网络编程;
2、熟悉XMPP协议,深入了解MSN,google talk等IM工具的功能架构和技术架构;
3、有openfire、Jabber等开源软件二次开发经验者;
4、有大规模高并发访问的服务集群架构设计和开发经验者优先;
5、有IM后台开发经验,有互联网通讯软件开发经验者优先;
6、具备良好的沟通协调能力和团队意识
7、开发过openfire离线文件传输插件者优先
8、有视频,语音,图像文件压缩技术开发经验者优先
烟台商机互联科技有限公司成立于2003年11月,是胶东地区最大的一家烟台网络公司,商机互联先后成立烟台商机互联科技有限公司、烟台商机互联科技有限公司太原分公司、烟台商机互联科技有限公司青岛分公司、烟台商机互联科技有限公司威海分公司、烟台商机互联科技有限公司东营分公司、烟台商机互联科技有限公司淄博分公司、烟台商机互联科技有限公司运城分公司、烟台商机互联科技有限公司潍坊分公司等地设立了多家分支机构及合作伙伴。员工总数1000多人,拥有300人的技术团队,已为10万多家企业提供了全方位的网络服务及IT咨询服务。烟台商机互联科技有限公司公司一直坚持“以人为本”、 “以客户为中心”的理念,不断提高员工的专业素质及技能,能够针对烟台网站建设的市场,烟台网站推广的市场,威海...
亲,该公司还没有获得点评哦
亲,该公司还没有人发布面经哦
亲,该公司还没有人分享工资哦
共有 11 位人脉
网站开发工程师
信息技术经理·主管
软件工程师
互联网软件开发工程师
行政总经理
公司地址:山东烟台市芝罘区青年南路408号
*提醒:用人单位招聘人才,以任何名义向应聘者收取费用都属于违法行为。请应聘者提高警惕,切勿上当受骗。
可能感兴趣的职位
友十(上海)网络科...
工作地点:上海-徐汇区
岗位工资:元
友十(上海)网络科...
工作地点:上海-徐汇区
岗位工资:元
友十(上海)网络科...
工作地点:上海-徐汇区
岗位工资:元
飞越东方国际教育...
工作地点:上海
岗位工资:面议
飞越东方国际教育...
工作地点:上海
岗位工资:面议
福美来不动产
工作地点:上海
岗位工资:面议
适合你的急招职位
相关职能搜索
相关地区搜索

我要回帖

更多关于 openfire 的文章

 

随机推荐