XMPP 开发相关 - mindpin/knowledge-space-net-lib GitHub Wiki

服务器端


ejabberd how-to

ejabberd 安装

  • Mac 下直接使用 brew install ejabberd,默认安装到 usr/local/Cellar/ejabberd/ 目录
  • linux/windows 还未具体实践
  • ubuntu 下的安装,可以参考

ejabberd 数据库

ejabberd 相关命令

  • 到安装目录下进入 sbin 目录,mac 下的路径是 /usr/local/Cellar/ejabberd/2.1.13/sbin
  • ejabberdctl start 启动该服务
  • ejabberdctl stop 停止服务
  • ejabberdctl register root localhost password 注册一个新用户, root 替换注册的用户名, password 替换成相应的密码
  • ejabberd.cfg (mac 下的目录 /usr/local/etc/ejabberd/ejabberd.cfg) 需要到该文件下设置一个超级用户, 找到有 acl, admin 字眼的地方,加入相关的用户名
  • 启动成功后访问 ejabbered 管理界面

支持查看在线用户


openfire how-to

openfire 安装, 服务器设置

  • 下载 openfire 安装包, 目前用的版本是 3.9.1
  • 安装过程中会有一些步骤包括 数据库连接信息,服务器设置 等
  • 安装完后访问 openfire WEB管理界面
  • Mac 下需要在 系统偏好设置下面可以找到 openfire 的设置

支持保存聊天记录到数据库

  • plugins 下载界面 下载 Monitoring Service
  • 把该 jar 包复制到 openfire 安装目录, 在 mac 下的目录是 /usr/local/openfire/plugins
  • 或者在 openfire WEB管理界面 的 插件页面找到 Monitoring Service 下载安装
  • openfire WEB管理界面 找到 服务器 -> 档案管理界面 -> 设置档案 启用保存聊天记录选项, 参考设置界面
  • 收发信息主要存到 ofMessageArchive 表
  • 可能的其它方案: 自己在android客户端截取收发信息存到数据库

支持查看在线用户

  • openfire WEB管理界面 找到 用户/组 -> 组 -> 新建组 , 参考设置界面
  • 把需要显示在线状态的用户都放到 friends 组
  • 暂时的结论: 使用 asmack API 包查询在线用户只能是同一组才能被查看到

openfire web 用户整合方案

方案一: 这是个折中方案,只能将 web 用户表同时复制一份到 openfire 数据库

  1. 安装 User Service 插件,查看该插件介绍 , 安装的目的是通过 rails web 可以发送 http 请求到 openfire server 进行用户注册,登录,密码修改等, 以此来跟 openfire 数据库用户表保持同步.

  2. 下载 web rails 客户端 , 这算是一个 demo 用例,主要提供的功能有向 openfire 服务器添加新用户,删除用户,修改密码

方案二: 可以只使用 web 数据库做为唯一验证接口 (尚未完成)

  1. 下载 openfire 源码 , Eclipse 开发环境的配置需要一些步骤.

  2. 为了在配置工程路径时可以更为简单一点,将解压后的源码目录重命名为 openfire

  3. 下载 jar 包导入界面

  4. 运行环境配置 Eclipse -> Run -> Run Configurations , main 配置 , classpath 配置 , arguments 配置, Main class:org.jivesoftware.openfire.starter.ServerStarter , VM arguments: -DopenfireHome="${workspace_loc:openfire}/target/openfire"

  5. hazelcast 插件会导致一些错误,可以在工程目录 src -> plugins 下将其删除, 同时在 eclipse -> Project -> properties -> Libraries 的引用去掉

  6. 在运行前,先在工程目录下 build 下面运行 ant, 运行后,如果能正常进行,会生成 target, work 两个目录, 在工程目录 target -> openfire -> conf 下,找到 openfire.xml 文件,可以设置指定的数据库,表等,具体参考 Custom Database Integration Guide , 工程目录 src -> conf 目录下也有个 openfire.xml 目录,但是测试后,不管怎么修改均没有什么效果

  7. 找到工程目录 src -> java -> org.jivesoftware.openfire.auth -> DefaultAuthProvider.java 文件, authenticate(String username, String password) 方法是该系统提供的一个修改用户名,密码的接口, MyAuthProvider 示例下载

  8. openfire web 管理界面找到 Server -> Server Manager -> System Properties 找到 provider.auth.className 属性修改成 MyAuthProvider, 或者在表 ofProperty 将该属性改成相应的值

  9. 根据 Eclipse 打包 将 MyAuthProvider 生成jar (MyAuthProvider.jar)包,放到 /usr/local/openfire/lib (mac 下的 openfire 安装包路径) , 目录 MyAuthProvider 的功能主要是向 web 服务器发送username, password 相关http 验证请求

  10. 可以使用 sudo killall java 删除掉用 eclipse 运行生成的进程,重新启动 openfire 安装包相关的服务,可以测试到 MyAuthProvider.jar 有生效

  11. authenticate 后面执行到的相关流程, 找到 org.jivesoftware.openfire.auth -> AuthFactory 176 行, org.jivesoftware.openfire.net -> SASLAuthentication 288行

  12. 暂时的结论跟问题: authenticate(String username, String password) 方法只是校验用户名和密码是否正确的,通过校验后,openfire 还是回去自己的用户数据库或者其它地方,可能是某种cache来查找 username 的数据条目,所以单纯改这个方法是行不通的,理论上还需要从 openfire 的源码中找到查询用户数据库的相关代码进行修改, 这个需要时间进一步尝试

插件开发相关

  1. 添加联系人

  2. 聊天记录


Android 客户端


Android 客户端测试

  1. 使用 openfire/ejabberd WEB管理界面 或者 ejabberd 命令行 注册几个账号,目的是用于互发信息
  2. 访问 ejabbered 管理界面 , 如果是用IP形式来访问,用户名要用 username@localhost 形式
  3. 目前个人使用 root@localhost, arch@localhost, arly@localhost 三个用户名进行测试
  4. 使用 mac 下 adium 登录测试是否能连接上本地配置好的服务器
  5. 下载 android 代码,修改 host 信息

Web 客户端


  1. 尝试部署一下openfire,看看服务端替换之后,android客户端是否不用改动

  2. 在android客户端上用一个列表列出在线用户(除了当前用户自己),点哪个用户就和哪个用户聊天

  3. 聊天改为可以互相聊天,也就是说android可以收消息也可以发消息

  4. 看看除了文字消息之外,还能发哪些类型的内容(图片?附件文件?音频?)

  5. 研究和已有web服务如何整合的问题,也就是说是否可以用已有的web服务的用户直接作为聊天服务的用户, 是否可以用其他web服务已有的用户名密码来登录。可以尝试查找其他人已经有的好的实践。

  6. 看看服务端是否保存聊天记录。如果服务端不保存聊天记录,怎么自己记。

  7. 如果服务端保存聊天记录,该保存格式是否兼容,切换服务器(比如从 ejabberd 切换到 openfire,聊天记录怎么转移。)

  8. 尝试实现用户看聊天记录的功能。

  9. 看看有没有基础的用户分组机制,简单研究一下


Web 功能

  • 注册,登录
  • 查看用户在线
  • 查看用户聊天记录功能

手机功能

  • 登录
  • 查看在线用户,可以相互聊天
  • 查看聊天记录

部署

通过研究后,总结出了一套部署方法,参考在现有web服务下部署openfire并整合用户的方案