您当前的位置:首页 > 计算机 > 服务器 > 网络服务

Openfire加Smack实现IM

时间:02-06来源:作者:点击数:

1、服务器配置

我买了一台华为虚拟主机,系统是Linux,并购买了域名,网站也备案了,域名为:android666.cn。

然后在这台虚拟主机上安装Openfire,安装教程可参考:https://www.cdsy.xyz/computer/system/linux/230205/cd40234.html

安装后浏览器打开http://android666.cn:9090即可打开管理后台,我的配置如下:

在这里插入图片描述

我把服务器名称和主机名都设置为:android666.cn,即我的网站域名。

2、登录

2.1 Spark注册和登录

注册很简单,打开Spark,点击左下角的“账号”按钮进入注册界面,如下:

在这里插入图片描述

输入账号、密码和服务器地址,点击“创建账号”即可。

账号创建后即可进行登录,如下:

在这里插入图片描述

在“高级”设置中无需进行任何设置即可进行登录,一切都用默认设置即可,如下:

在这里插入图片描述
在这里插入图片描述

登录成功后,效果如下:

在这里插入图片描述

2.2 Smack实现登录

官方使用文档:https://download.igniterealtime.org/smack/docs/latest/documentation/

Smack依赖设置:https://github.com/igniterealtime/Smack/wiki/Smack-4.4-Readme-and-Upgrade-Guide

根项目的build.gradle:

allprojects {
    repositories {
        maven {
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenCentral()
    }
}

Module的build.gradle:

dependencies {
    implementation "org.igniterealtime.smack:smack-android-extensions:4.4.0"
    implementation "org.igniterealtime.smack:smack-tcp:4.4.0"
}

configurations {
    all*.exclude group: 'xpp3', module: 'xpp3'
}

权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

SDK初始化,可放到Appliation中进行:

AndroidSmackInitializer.initialize(this)

配置好这些之后,就可以开始写代码了,官方教程中演示了一个登录的示例,如下:

private fun login() {
    thread {
        try {
            val connection = XMPPTCPConnection("test001", "123456", "android666.cn")
            connection.connect().login()
            toast("登录成功")
        } catch (e: Exception) {
            Log.e(tag, "登录失败", e)
            toast("登录失败")
        }
    }
}
fun toast(text: CharSequence) {
    if (Looper.myLooper() == Looper.getMainLooper()) {
        Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
    } else {
        runOnUiThread {
            Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
        }
    }
}

登录代码是很简单,但是登录时失败的,报错如下:

2021-03-08 15:50:10.499 13630-13727/cn.android666.imdemo E/MainActivity: 登录失败
    org.jivesoftware.smack.SmackException$SmackWrappedException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at org.jivesoftware.smack.AbstractXMPPConnection.setCurrentConnectionExceptionAndNotify(AbstractXMPPConnection.java:690)
        at org.jivesoftware.smack.AbstractXMPPConnection.notifyConnectionError(AbstractXMPPConnection.java:994)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection.access$4100(XMPPTCPConnection.java:130)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1152)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$700(XMPPTCPConnection.java:913)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:936)
        at java.lang.Thread.run(Thread.java:929)

这里我并没有把异常贴完整,但也足够了解原因了,关键点:CertPathValidatorException: Trust anchor for certification path not found. 这一看就知道是证书的问题,我们并没有为Openfire配置证书,但是默认登录时它会使用证书配置进行登录,所以报错了。所以解决方案就是在登录时,让他不要使用证书,如下:

private fun login() {
    thread {
        try {
            val config = XMPPTCPConnectionConfiguration
                .builder()
                .setUsernameAndPassword("test001", "123456")
                .setXmppDomain(JidCreate.domainBareFrom("android666.cn"))
                .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) // 禁用安全模式
                .build()
            val connection = XMPPTCPConnection(config)
            connection.connect().login()
            toast("登录成功")
        } catch (e: Exception) {
            Log.e(tag, "登录失败", e)
            toast("登录失败")
        }
}

再次登录,就可以登录成功了!

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门