2025年4月11日 星期五 乙巳(蛇)年 正月十二 夜 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 服务器 > 网络服务

Openfire加Smack实现IM

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

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("登录失败")
  • }
  • }

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

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