openfire源码分析(一)

openfire的核心功能可以概括为:连接管理\消息解析\消息路由\消息发送。
服务器在调用xmppserver的start函数时加载并初始化了很多模块,其中包括ConnectionManager模块,它的实现是ConnectionManagerImpl。

openfire在消息处理中使用的是mina框架的nio机制。而服务器采用的是内置的jetty框架。
ConnectionManagerImpl初始化函数中创建了各种ConnectionListener用于监听不同的端口。当客户端发送数据过来的时候就会交给ClientConnectHandler类的messageReceived()方法进行处理。在这里面会对从客户端接收到的消息进行处理。

mina框架介绍
Mina 的执行流程如下所示:
(1) IoService:这个接口在一个线程上负责套接字的建立,拥有自己的Selector,监听是否有连接被建立。
(2.) IoProcessor:这个接口在另一个线程上,负责检查是否有数据在通道上读写,也就是说它也拥有自己的Selector,这是与我们使用JAVA NIO 编码时的一个不同之处,通常在JAVA NIO 编码中,我们都是使用一个Selector,也就是不区分IoService与IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在IoService 上的过滤器,并在过滤器链之后调用IoHandler。
(3.) IoFilter:这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write 方向)与解码(read 方向)等功能,其中数据的encode 与decode是最为重要的、也是你在使用Mina 时最主要关注的地方。
(4.) IoHandler:这个接口负责编写业务逻辑,也就是接收、发送数据的地方。

今天将客服包里面的接口和androidpn包里面的类进行了融合,使得后台服务器用的是openfire提供库asmack提供的接口。asmack没有提供添加好友,群聊,聊天,添加好友等接口,还有tls登录方式认证。

现在的学习目标是要了解用户添加好友的方法,还有怎样判断登录和注册是否成功。

ConnectionManagerImpl在初始化的时候会创建很多的服务器套接字,其中5222就是用来监听客户端发送数据包的套接字。在startListeners函数中调用每个监听的start函数,并且调用HttpBindManager.start()。
在connectiolistener的start函数里面会创建监听每个端口的套接字,接收到用户数据报之后就会创建相应的线程对用户数据进行处理,最后进入 blockingreadingmode的run里面调用readstream函数,这里会根据读到的字节流的名字的不同进行不同的处理,比如iq类型就是在packetrouter里面调用iqrouter的route方法进行处理。

关于openfire的博客:http://i-feng.iteye.com/blog/1733658
jetty相关的博客:http://www.ibm.com/developerworks/cn/java/j-lo-jetty/

今天实现了asmack添加好友的功能,客户端直接使用presence实现。问题是发出请求,不用等对方确认就是直接添加好友成功。
Presence subscription=new Presence(Presence.Type.subscribe); subscription.setTo(friendUsername+”@”+XmppManager.getInstance(null).getConnection().getServiceName());
XmppManager.getInstance(null).getConnection().sendPacket(subscription);

通过PacketFilter packetFilter = new PacketTypeFilter(Presence.class)的方式对所有presence的消息进行处理,都没有处理成功,不知道是不是服务器没有发送过来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值