欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信

程序员文章站 2022-07-13 14:42:59
...

1 出发点

  • React Web 端聊天室
  • 离线消息保存与推送

2 本文涉及的资源

  • Tigase XMPP Server 8.0 下载
  • StropheJS 1.3.2
  • Psi 下载
  • 阿里云服务器 Centos 7.4
  • MySQL 5.7

3 Tigase安装

前提条件,没准备的话就请先搞好:

  • JDK已经安装好了,设置了JAVA_HOME
  • 数据库已安装好(优先MySQL)
  • 你有数据库的root权限
  • 服务器8080端口可访问(安全规则)

3.1 Centos服务器中创建新用户与用户组。
SSH连接服务器,进入控制台,创建一个名为tigase的新用户以及用户组

	adduser tigase   #创建用户 tigase
	passwd tigase    #设置该用户的密码
	groupadd tigase  #创建用户组 tigase
	usermod -G tigase tigase #将用户tigase设为tigase用户组

3.2 Tigase 安装包解压
以刚创建的 tigase用户登陆服务器 (之前请将下载 的Tigase 压缩包用工具上传到服务器,反正我放到了 /home/tigase/ SSH上传工具)。

	tar -zxvf tigase-server-8.0.0-b10083-dist-max.tar.gz  #解压缩
	mv tigase-server-8.0.0-b10083 tigase-server  #将解压后的文件夹改名为tigase-server

3.3 启动Web安装脚本
确认你当前用的是之前创建 tigase用户! 你要是开着 root 用户去做后续的步骤容易翻车!进入安装包启动脚本:

	cd /home/tigase/tigase-server  #进入安装包,必须在这个文件夹里
	scripts/tigase.sh start etc/tigase.conf #执行启动脚本

3.4 Web安装
如果之前的步骤正常,用浏览器访问服务器的8080端口(注意安全规则)就会出现引导安装界面。输入默认用户名: admin 默认密码:tigase,完成后如下图,点击NEXT跟着走就是了:
(1)About software . 直接NEXT
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
(2)Setup: Advanced Clustering Strategy information .随便填个你的公司名称
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
(3)Setup: Basic Tigase server configuration . 这里就需要你设置
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
(4)Setup: Advanced configuration options 直接NEXT,集群需要开启ACS(付费)
(5)Setup: Plugins selection 直接NEXT
(6)Setup: Database configuration 这里就需要之前创建的用户tigase数据库root权限
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
(7)Setup: Database connectivity check 正常的话就是一片绿
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
(8)Setup: Setup security 可不填或者填入之前创建的tigase用户,NEXT
(9)Setup: Saving configuration 这里是关键配置文件的模板,注意存放位置,NEXT
(10 初始化结,切换到服务器控制台

3.5 重启 Tigase
(1)停止

 	cd /home/tigase/tigase-server #进入安装包所在文件夹
 	./scripts/tigase.sh stop #执行脚本

(2)修改配置文件中的 JAVA_HOME
我的配置文件全路径 /home/tigase/tigase-server/etc/tigase.conf

	vi etc/tigase.conf

找到JAVA_HOME,去掉注释#, 修改为你安装的JDK的路径。我修改后如下:

	JAVA_HOME=/opt/jdk/jdk1.8.0_201

(3)启动Tigase
确认你的当前为用户tigase,当前位置为/home/tigase/tigase-server,然后输入命令。我是Centos所以选择了redhat,其他系统可以在对应文件夹中自行查看:

	./scripts/redhat/init.d/tigase start etc/tigase.conf

最后会要求你输入 tigase 用户的密码。看到了没,反复要求这个用户名,你要是用root用户得改很多配置,容易翻车。成功则如下:

	Starting Tigase XMPP server
	Password: 
	Tigase started                                             [  OK  ]

3.6 开放端口
确认当前为tigase用户,查看Tigase 监听的端口:

 	netstat -anp | grep java

阿里云是配置安全规则,自己的服务器可以配置防火墙(tigase用户是没有开端口权限的,注意),打开端口5222/5223/5269/5280/5290

tcp6       0      0 :::5223       :::*      LISTEN      9409/java           
tcp6       0      0 :::5290       :::*      LISTEN      9409/java           
tcp6       0      0 :::8080       :::*      LISTEN      9409/java           
tcp6       0      0 :::5269       :::*      LISTEN      9409/java           
tcp6       0      0 :::5280       :::*      LISTEN      9409/java           
tcp6       0      0 :::5222       :::*      LISTEN      9409/java 

到此最精简的 Tigase XMPP服务器搭建成功

4 Tigase Psi 连接测试

本部分主要是为了让大家有个使用过程的初步概念,涉及注册、上线、建立会话、状态改变、离线消息等。这里用到了Psi 软件,这是一个已经实现好的聊天客户端,下载安装即可。我这里用的是Window 64位的安装包。

4.1 注册两个账户,并处于在线状态
新安装的Psi启动后会要求你注册账户,填入Tigase服务器IP地址。点击Next
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
出现如下界面则已表示我们的 Tigase 服务器 已经正常工作咯,是不是很简单?
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
填入信息,注册成功
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
可以注册多个用户
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
用户上线:
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
4.2 用户之间发送消息
用户之间必须得建立会话才能通信,就和QQ、微信加好友一样
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
填入对方XMP address JID:
用户地址格式: 用户名aaa@qq.com+服务器IP地址
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
在主界面同意加好友:
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
多开发送消息:
XMPP tigase 8.0 与 strophe.js 测试Web聊天服务/即时通信
4.3 总结
要满足Web端的聊天需求,我们需要在Web端实现类似Psi客户端的注册、上线、建立会话的过程,这就涉及到了strophe.js

5 strophe.js + react 框架做 Web端

create-react-app 脚手架如何搭建工程以及 Ant Design 的使用就不细说了哈。这里主要说一下怎么简单的使用strophejs。源文件太乱,下面贴一些精简的代码示意关键步骤。

5.1 安装
这里用到官方发布的1.3.2稳定版本

	npm install aaa@qq.com --save

5.2 组件
在组件中引入 strophe.js的组件:

import {Strophe, $msg, $pres }from 'strophe.js';

5.3 初始化连接对象
典型的在生命周期中初始化state,这里设置了一个connection来接受对象(初始化不会产生连接行为)。注意配置BOSH_SERVICE到自己的服务器IP

const BOSH_SERVICE = 'http://192.168.30.130:5280/xmpp-httpbind';

class WebIM extends React.Component{
	...
    state = {
        connection: null
    }
    ...
    componentDidMount() {
        this.setState({
            connection: new window.Strophe.Connection(BOSH_SERVICE)
        });
    }
    ...
    render() {
        return (
            <div>
            	........
            </div>
        )
    }
}

5.4 开始连接
你可能设置了一个登陆按钮之类的,点击的时候触发连接事件函数,如下代码示例:

  • strophe.js 》connect()
  • 可以配置你在Psi注册的用户名 aaa@qq.com, 密码test
	//按钮等绑定的事件函数,触发tigase连接
    handleConnectClick = (e) => {
            this.state.connection.connect("aaa@qq.com", "test", this.handleXMPPCallback);
    }

5.5 连接时回调函数
参照 5.4节的代码,在连接tigase会返回一些参数值表示当前状态,我们关注连接成功与断开连接就可以了。如下示例在连接成功后为该用户绑定一个 message 消息的处理函数。

  • strophe.js 》addHandler()
    // 作为connect() 连接时的回调函数,判断连接状态,详情查阅 Strophe.Status
    handleXMPPCallback = (status) => {
    	//如果 Tigase 返回连接成功
		 if (status === window.Strophe.Status.CONNECTED) {
		 	//绑定普通会话消息的的处理函数
            this.state.connection.addHandler(this.handleXMPPMessage, null, 'message', null, null,  null); 
            this.state.connection.send($pres().tree());
        }
		//必须返回 true 否则回调函数只会生效一次
        return true;
    }

5.6 消息处理函数
msg 包含了接受收到数据(XML),需要利用strophe.js提供的函数分离出你关注的部分,做你自己的业务逻辑就行了。

handleXMPPMessage = (msg) =>{
		var from = msg.getAttribute('from');
	    var elems = msg.getElementsByTagName('body');
    	//只处理chat类型消息
        if (type == "chat" && elems.length > 0) {
        	var body = elems[0];
        	console.log('我收到了来自: ' + from + ': ' + window.Strophe.getText(body));
        }
	//必须返回 true 否则回调函数只会生效一次
	return true;
}

5.7 消息发送到目标用户
你可能通过一个按钮绑定了该发送函数,传入目标用户的地址与消息内容,通过 strophe.js提供的 $msg 构建一个消息对象,向目标用户地址发送。

  • strophe.js 》$msg
  • strophe.js 》send ()
  • 不了解XMPP协议建议别改动 “type:chat” 以及 “body”
  • 消息从 from 发送到 to
    handleXMPPSend = ()=>{
        var msg = window.$msg({
            to: "aaa@qq.com",
            from: "aaa@qq.com", 
            type: 'chat'
        }).c("body", null, "消息: 我是大佬么?");
        this.state.connection.send(msg.tree());
    }

上一篇: POI的简单使用

下一篇: JUC之线程池