iOS实现XMPP通讯(一)搭建Openfire

安装Openfire

  • Openfire官网下载地址://igniterealtime.org/downloads/ (也是Spark客户端的下载地址)
    Openfire下载并安装后,打开系统偏好设置,底部会出现Openfire
  • 试图启动openfire,终端命令:
cd /usr/local/openfire/bin
./openfire.sh

出现报错信息:openfire Error: JAVA_HOME is not defined correctly. /System/Library/Frameworks/JavaVM.framework/Home
Openfire默认提供的路径是错误的,百度一下,说是要修改java_home路径,有两种方法解决:
方法一:修改/usr/local/openfire/bin/openfire.sh中JAVA_HOME的路径
方法二:系统全局声明JAVA_HOME的路径

  • 查看JDK安装路径,终端命令:
/usr/libexec/java_home -V

以上电脑安装有2个JVM(JDK中包含了JRE,JRE中包含了JVM),简单说明:

/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home是系统自带的JRE路径
/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home是JDK路径
最底下的/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home表示当前系统默认使用自带的JRE路径

即当前JAVA_HOME的路径为/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home,为此我们需要切换到jdk 1.8.0_40版本的路径:/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home。

  • 方法一:修改/usr/local/openfire/bin/openfire.sh文件中JAVA_HOME的路径
    由于openfire.sh文件是只读权限,需要给它赋予读写权限才能进行写入操作。一般来说给openfire.sh文件和其父文件夹bin赋予读写权限就能编辑openfire.sh文件,但后面执行openfire.sh脚本时发现,脚本需在/usr/local/openfire文件夹中创建一些文件夹及文件,如果权限不足会导致出现报错信息,为了避免这种情况,我们直接遍历/usr/local/openfire文件夹,给子目录和子文件都赋予读写权限,终端命令:
//-R表示遍历文件夹的子文件或子文件夹
sudo chmod -R 777 /usr/local/openfire

打开openfire.sh,在”Darwin*) darwin=true”下面第二行的位置替换”JAVA_HOME=”后面的内容为/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home,如下:

  • 方法二:系统全局声明JAVA_HOME的路径(推荐)
    cd ~/.bash_profile,编辑.bash_profile文件,添加如下内容
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home
PATH=$JAVA_HOME/bin:$PATH
export PATH

然后让配置立即生效,终端命令:

source ~/.bash_profile
  • 启动openfire(前提必须保证/usr/local/openfire子目录和子文件有读写权限),终端命令:
cd /usr/local/openfire/bin
./openfire.sh

以上启动openfire后,默认会去监听9090端口。由于openfire没有提供关闭服务器的脚本,如果需要关闭openfire,可以用杀死进程的方式间接关闭openfire,具体做法:

sudo lsof -i:9090    //查看端口号所在的进程信息(PID是进程号)
kill -9 PID    //杀掉指定进程PID,释放被占用的端口号

以上必须用kill -9。这里对kill的用法做个科普:

kill命令默认的信号是15,也就是kill -15,是优雅的退出。当使用kill -15时,系统会发送一个SIGTERM的信号给对应的程序,通知其进行“安全、干净的退出”。当程序接收到SIGTERM信号后,退出前一般会进行一些”准备工作”,如资源释放、临时文件清理等。准备工作做完了,再进行程序的终止,但如果在”准备工作”进行过程中,遇到阻塞或者其他问题导致无法成功,那么程序可以选择忽略该终止信号。这就是为何有时kill命令没法杀死应用程序的原因,因为SIGTERM(15)信号是可以被阻塞和忽略的。
像很多java程序,发送kill命令,程序不会立即退出,通常要等个几十秒之后才会退出。这时我们可以使用kill -9强制杀死的命令,系统会发出SIGKILL信号,程序接收到该信号后立即退出,不能被阻塞或者忽略。

注意:后来发现./openfire.sh开启openfire后台服务器后,是可以用快捷键control+C关闭的。

  • 进入系统偏好设置->Openfire,查看Openfire的开启状态。如果没开启就点击Start Openfire,在绿色Running时,点击Open Admin Console,自动进入浏览器打开Openfire的后台服务器//localhost:9090

配置Openfire后台服务器

  • 语言选择:中文,点下一步。
    服务器设置:域(即服务器名称,用户JID会显示该值)填写192.168.2.2,Server Host Name(主机名,用于登录)填写127.0.0.1,端口按默认9090,点下一步。
    数据库设置选择:嵌入的数据库(Openfire自带数据库,不需要外部数据库),点下一步。
    配置文件设置选择:默认设置,点下一步。
    管理员账户:管理员电子邮箱按默认,密码填写123456,点下一步完成配置。
    请添加图片描述
    之后点击“登录到管理界面”,输入账号admin,密码123456,进入Openfire后台管理。
  • 创建用户。点击用户/用户群->新建用户,依次创建用户名hong、ming、wang,密码统一设置为123456,方便记。
    请添加图片描述
    之后就可以用Spark客户端(在Openfire官网上有得下载),登录用户账号,添加好友进行交流了。

卸载Openfire

  • 卸载Openfire的终端命令:
sudo rm -rf /usr/local/openfire
sudo rm -rf /Library/PreferencePanes/Openfire.prefPane
sudo rm -rf /Library/LaunchDaemons/org.jivesoftware.openfire.plist
Tags: