基于asmack的聊天

2023-11-03 04:10
文章标签 聊天 asmack

本文主要是介绍基于asmack的聊天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

现在的聊天模块的功能基本上很多项目都会用到,关于聊天的实现有些是原生的(native)的有些是基于第三方SDK的比如融云,环信

等。原生的开发的难度和工作量会大一点但是灵活性和维护度简单点。第三方的即时通讯的优点是快速的集成和开发大大降低了开

发的难度和时间的周期。

下面是基于Openfire+asmack实现的聊天属于原生的开发即时通讯吧。下个环节我会推出关于基于融云SDK的即时通信开发。

 源码的下载,聊天是其中的一个模块在wechar包中其它的代码忽略就好了。

 源码 下载

 github 下载


 环境安装

 Openfire的安装和配置包括创建房间添加用户,spark的安装这里不做详细解说百度资源一大把。


 连接服务器,登录,加入聊天室

 这里的代码做三件事

/**
 * 1、连接服务器
 * 2、登录
 * 3、加入群聊天
 * */
 链接服务器
<span style="font-family:Arial;font-size:14px;">ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("125.65.82.216", 5222, "125.65.82.216");XMPPConnection xmppConnection = new XMPPConnection(connectionConfiguration);try {//链接服务器connectionConfiguration.setReconnectionAllowed(true);xmppConnection.connect();
} catch (XMPPException e) {e.printStackTrace();Log.i("ERROR", e + "");}</span>
这里对下面的代码进行说明一下,后面的三个单数分别表示,IP地址,端口号(一般都是5222),服务器的名称在搭建Openfire时
进行命名的注意在这里搭建openfire的时候尽量在局域网内搭建不然老是链接不了服务器
<span style="font-family: Arial;font-size:14px;">ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("125.65.82.216", 5222, "125.65.82.216");</span>

登录和加入聊天室

<span style="font-family:Arial;"><span style="font-size:14px;"> if (xmppConnection.isConnected()) {Log.i("LOGIN", "加入成功");//登录xmppConnection.login("bruse", "123");//加入群聊multiUserChat = new MultiUserChat(xmppConnection, "bruse@conference.125.65.82.216");//加入后的昵称multiUserChat.join("bruse");
}</span></span>

这里的表示房间的名称,注意后面加上@conference.XXX,在Spark可以看到对应的房间名称

<span style="font-family:Arial;font-size:14px;">bruse@conference.125.65.82.216</span>


如果加入房间成功后会提示如下



发送消息

使用asmack框架中的Message类进行对消息的封装,消息的发送人、接受者,消息类型(群聊、单聊),然后使用MultiUserChar
进行消息的发送。网络的发送,注意新建一个工作线程:
 
<span style="font-family:Arial;"><span style="font-size:14px;">Message message = new Message();//设置发送给谁message.setTo("bruse@conference.125.65.82.216");message.setFrom("bruse@125.65.82.216");message.setType(Message.Type.groupchat);Log.i("asmack", message.getFrom());//设置消息的内容message.setBody(body);//进行发送MyService.multiUserChat.sendMessage(message);</span></span>

  

这里为什么我发送消息给房间为什么房间会再发给我,这里做一下解释因为你是在房间里面会自动接受消息,就是说房间会自动推
送消息给你。如果是单聊模式就不会有这种重复的推送。比如下面的接受服务器的消息:

<span style="font-family:Arial;"><span style="font-size:14px;">                        /***这里进行接收消息* */xmppConnection.addPacketListener(new PacketListener() {//如果服务器发消息给客户端则执行下面的方法@Overridepublic void processPacket(Packet packet) {if (packet instanceof Message) {//强制转换判断类型final Message message = (Message) packet;Message.Type type = message.getType();final MessageModel messageModel = new MessageModel();if (type == Message.Type.groupchat) {/*** 工作线程里面是不能动UI的** */if (CharActivity.instance != null) {CharActivity.instance.runOnUiThread(new Runnable() {@Overridepublic void run() {//这样就进入到主线程messageModel.setFrom(message.getFrom());messageModel.setMessage(message.getBody());//这里进行测试Log.i("服务器", message.getFrom());if (CharActivity.instance != null) {CharActivity.instance.data.add(messageModel);handler.sendEmptyMessage(0);}}});}}}}}, null);
</span></span>

当房间里面接受到新的消息的时候就会调用下面的方法:

<span style="font-family:Arial;">xmppConnection.addPacketListener(new PacketListener() </span>

注意工作线程里面是不能动UI的,所以要用下面这个方法进行改动聊天界面的UI,其中用来单例模式

<span style="font-family:Arial;">CharActivity.instance.runOnUiThread(new Runnable()</span>

还有一点就是在线程中是不能进行ListView的数据的更新的,所以这里用Handler+Message进行解决

<span style="font-family:Arial;"> private Handler handler = new Handler() {@Overridepublic void handleMessage(android.os.Message msg) {super.handleMessage(msg);switch (msg.what) {case 0:CharActivity.instance.messageAdapter.notifyDataSetChanged();
//                    CharActivity.instance.lvMessage.setAdapter(CharActivity.instance.messageAdapter);CharActivity.instance.lvMessage.setSelection(CharActivity.instance.data.size());break;}}};</span>

执行:

<span style="font-family:Arial;">handler.sendEmptyMessage(0);</span>
 
效果图:

   

关于asmack框架的聊天简单的介绍就这么多,后面会推出基于融云的SDK进行的第三方SDK的即时通讯的实现,这里的基于asmac
k框架是大致的简介一下具体的单聊文件发送这些共功能的实现可后期进行完善比如单聊:

 
<span style="font-family:Arial;">/*** 发送消息* * @param to* @param msg*/public static void sendTalkMsg(String to, String msg) {Chat chat = MyApplication.xmppConnection.getChatManager().createChat(to, null);try {chat.sendMessage(msg);ConnecMethod.postFiletoService("130560779417728750.png",text_loading);} catch (XMPPException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
</span>

最后谢谢大家的支持,别忘记扫描头像关注公众号进行“激情裸聊”谢谢大家~~~~~~!

 

这篇关于基于asmack的聊天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/335492

相关文章

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

linux下TCP/IP实现简单聊天程序

可以在同一台电脑上运行,在一个终端上运行服务器端,在一个终端上运行客户端。 服务器端的IP地址要和本地的IP相同,并分配端口号,客户端的默认设置为本地,端口号自动分配。 服务器端: #include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.

C/C++ 网络聊天室在线聊天系统(整理重传)

知识点: TCP网络通信 服务端的流程: 1.创建socket套接字 2.给这个socket绑定一个端口号 3.给这个socket开启监听属性 4.等待客户端连接 5.开始通讯 6.关闭连接 解释: socket:类似于接口的东西,只有通过这个才能跟对应的电脑通信。 每一台电脑都有一个IP地址,一台电脑上有多个应用,每个应用都会有一个端口号。 socket一般分为两种类型,一种是通讯,一种是监听

实现简单聊天

管道通信 目的: 实现 xxz 与 zy 之间的通讯聊天 功能: 同一网络下进行的模拟通讯实现 缺点:没有涉及到网络的通信,只是简单的进程之间模拟的通信 采用到的技术点: 1 有名管道 优点: 在文件系统中作为一个特殊的文件而存在,但管道中的内容却存放在内存中。 2 文件操作 3 多进程创建与回收 4 动态宏定义 【因为是写在一个程序中 模拟两个程序作用】 5 文件描述符操作

AI聊天应用不能上架?Google play对AI类型应用的规则要求是什么?

随着生成式AI模型的广泛应用,很多开发者都有在开发AI应用或将其整合到应用中。我们知道,谷歌是非常注重应用生态的,去年开始就推出了一些针对生成式AI应用的政策,对AI应用的内容质量和合规性问题提出了一些要求。 几天前,还有开发者聊到,现在AI类型应用(如AI聊天)上架越来越难了。 (可斯信进qun与众多开发者交流上架经验) 这很可能是没了解清楚Google play 对AI应用的一些

前端百科---Web聊天排版

当页面需要进行展示对话聊天信息时,好的布局会让人赏心悦目.下面直接看demo: <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style type="text/css">html, body, div, img, span {padding: 0;margin: 0

netty-socketio和Socket.IO实现网页在线聊天功能

1.前端框架 Socket.IO 官方文档:https://socket.io/docs/v4/client-api/#iourl Socket.IO 是一个库,它支持客户端和服务器之间的低延迟、双向和基于事件的通信。 Socket.IO连接可以通过不同的底层传输建立: HTTP长轮询WebSocketWebTransport Socket.IO将自动选择最佳可用选项 优点: 在Web

计算机网络13——IM聊天系统——网络功能实现——UDP

目录 1、类的成员变量 2、魔鬼数字 3、创建接收数据的线程 4、线程函数 5、防止旧接收到的数据被新数据覆盖掉 6、拷贝用的函数:memcpy_s 7、回收线程资源 8、计数器-1 (1)结束线程工作 (2)关闭句柄 测试代码 1、类的成员变量 同一个类中的多个函数中都要使用的变量应设置为类的成员变量 2、魔鬼数字 解决方法:定义成宏 目的:1、好理解

使用 Python 设计一个支持多客户端通信的简单聊天应用

使用 Python 设计一个支持多客户端通信的简单聊天应用 在现代网络应用中,聊天应用是一个非常常见的功能。无论是即时通讯工具、社交媒体平台,还是在线客服系统,聊天功能都扮演着重要角色。本文将详细介绍如何使用 Python 设计一个支持多客户端通信的简单聊天应用。我们将使用 socket 模块实现服务器和客户端,并通过多线程技术实现并发通信。 为什么选择 Python 和 Socket 编程?

ai聊天软件哪个好用?分享5款实用的智能聊天软件

从文字到语音,再到现在的智能AI聊天软件,我们见证了沟通方式的不断演进。 每天,我们都需要与家人、朋友、同事进行交流,而AI聊天软件的出现,无疑为我们的对话增添了一抹智能色彩。 那么,ai聊天软件下载哪个更好呢?如果你对这个话题充满好奇,那就跟随我,一起来探索这些能够让你的日常对话变得更智能、更有趣的工具吧! 一、AI写作宝:智能辅助,写作无忧 ┇亲身体验后的评价┇ • 这款软件以其