XMPP与Openfire
准备做一个实时应用的服务端,由于以前都是基于http协议开发的,没有这方面的经验
查了下V2EX和知乎,发现目前国内大部分成熟应用用的协议都是XMPP,如米聊、微信和国外的kik
以下是知乎上对XMPP的评价
使用XMPP协议(Openfire + Spark + Smack) 简介:基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织完成了标准化工作。 优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有开源的Java版的开发实例androidpn。 缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。
1. 部署开发环境
1.1 参考文章
- Home page
- Download page
- 中文wiki
- Building the Source
- Javadoc
- Openfire Plugin Developer Guide
- 官方部署开发环境文档 - Openfire SVN + Eclipse 3.3 + Subversive Installation Guide
- Openfire开发配置,Openfire源代码配置,OpenFire二次开发配置
- Openfire源码布署与打包
- openfire开发文档
- Database Schema Guide
- OpenFire客户端编程示例
- Android基于XMPP Smack Openfire开发IM【一】登录openfire服务器
- Android基于XMPP Smack Openfire开发IM 【二】获取好友列表
- Android基于XMPP Smack Openfire开发IM【三】客户端接收服务器发送的消息
- Android基于XMPP Smack Openfire开发IM【四】初步实现两个客户端通信
- 即时通讯软件openfire+spark+smack
- xmpp with openfire之四 扩展的AuthProvider
- XMPP协议及其服务器端的Openfire插件开发
- xmpp with openfire之一 xmpp and openfire
- xmpp with openfire之二 openfire安装
- xmpp with openfire之三 openfire扩展小试 整合现有系统用户
- xmpp with openfire之四 扩展的AuthProvider
- xmpp with openfire之五 插件-利用Broadcast实现群
- openfire 开发插件
- openfire插件开发续一(xmpp4r)
- openfire插件开发续二
- openfire插件开发三,java端开发
- 【openfire插件开发】IQHandler处理IQ请求包(模板方法模式)
- openfire开发文档
- openfire插件开发最简单的demo
- Openfire插件开发流程
- openfire+smack新用户注册、更改用户状态
- Android基于XMPP Smack openfire 开发的聊天室(四) 【创建房间、表单;报文】
- spark openfire conference修改使群组编程持久的。 类似qq群(1)
- 改造MUC实现Openfire群
- XEP-0045: 多用户聊天
- Database Schema Guide
1.2 Mac下启动与关闭Openfire(通过dmg包安装)
关闭
sudo launchctl unload /Library/LaunchDaemons/org.jivesoftware.openfire.plist
启动
sudo launchctl load /Library/LaunchDaemons/org.jivesoftware.openfire.plist
1.3 编译源码
1.3.1 ant编译
cd /Users/jiangrongyong/Program/openfire_src/build
ant openfire
1.3.2 启动openfire
#先启动mysql
/usr/local/mysql/bin/mysqld
#openfire启动脚本
/Users/jiangrongyong/Program/openfire_src/target/openfire/bin/openfire.sh start
2. 通用术语
- Bare JID(纯JID) 一个用户的标识符 <user@host>, 不同于任何已有会话或资源的上下文, 与之相对的是全JID和房间JID.
- Full JID(全JID) 一个在线用户的标识符 <user@host/resource> , 不同于一个房间的上下文; 与之相对的是纯JID和房间JID.
- Affiliation(岗位) 一个长期存在的和房间之间的联系或连接; 可能的岗位有
owner
(所有者),admin
(管理者),member
(成员), 以及outcast
(被排斥者) (当然也可能没有岗位); 岗位(affiliation)和角色(role)是有区别的. 一个岗位跨越了用户对一个房间的访问期间. - Occupant(房客) 一个房间里的任何Jabber用户 (这是一个 “抽象类” 并且不对应任何特定的角色).
3. 接口
3.1 邀请接口
http://wiki.jabbercn.org/XEP-0045#.E9.97.B4.E6.8E.A5.E9.82.80.E8.AF.B7
客户端请求
<message from='crone1@shakespeare.lit/desktop' to='darkcave@chat.shakespeare.lit'>
<x xmlns='http://jabber.org/protocol/muc#user'>
<invite to='hecate@shakespeare.lit'>
<reason>
Hey Hecate, this is the place for all good witches!
</reason>
</invite>
</x>
</message>
源码在LocalMUCUser.java
296行开始
错误返回
<message id="jBnmc-4" to="admin@localhost/Smack" from="room39@conference.localhost" type="error">
<x xmlns="http://jabber.org/protocol/muc#user">
<invite to="hugh@localhost">
<reason>meizi</reason>
</invite>
</x>
<error code="406" type="modify">
<not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"></not-acceptable>
</error>
</message>
4. 读源码
4.1 LocalMUCUser.java process()
- 处理
decline
拒绝邀请 (239行)
5. 错误码
http://blog.csdn.net/love254443233/article/details/7887279