基于asmack的聊天

现在的聊天模块的功能基本上很多项目都会用到,关于聊天的实现有些是原生的(native)的有些是基于第三方SDK的比如融云,环信等。原生的开发的难度和工作量会大一点但是灵活性和维护度简单点。第三方的即时通讯的优点是快速的集成和开发大大降低了开发的难度和时间的周期。

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

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

源码 下载

github 下载

环境安装

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

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

这里的代码做三件事

/**
 * 1、连接服务器
 * 2、登录
 * 3、加入群聊天
 * */
 链接服务器
<em> </em>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 + "");
                }
这里对下面的代码进行说明一下,后面的三个单数分别表示,IP地址,端口号(一般都是5222),服务器的名称在搭建Openfire时进行命名的,注意在这里搭建openfire的时候尽量在局域网内搭建不然老是链接不了服务器
ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("125.65.82.216", 5222, "125.65.82.216");

登录和加入聊天室

 if (xmppConnection.isConnected()) {
                        Log.i("LOGIN", "加入成功");
                        //登录
                        xmppConnection.login("bruse", "123");
                        //加入群聊
                        multiUserChat = new MultiUserChat(xmppConnection, "[email protected]");
                        //加入后的昵称
                        multiUserChat.join("bruse");
}

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

[email protected]

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


发送消息
使用asmack框架中的Message类进行对消息的封装,消息的发送人、接受者,消息类型(群聊、单聊),然后使用MultiUserChar
进行消息的发送。网络的发送,注意新建一个工作线程:‘
Message message = new Message();
                    //设置发送给谁
                    message.setTo("[email protected]");
                    message.setFrom("[email protected]");
                    message.setType(Message.Type.groupchat);
                    Log.i("asmack", message.getFrom());
                    //设置消息的内容
                    message.setBody(body);

                    //进行发送
                    MyService.multiUserChat.sendMessage(message);
  
这里为什么我发送消息给房间为什么房间会再发给我,这里做一下解释因为你是在房间里面会自动接受消息,就是说房间会自动推送消息给你。如果是单聊模式就不会有这种重复的推送。比如下面的接受服务器的消息:
                        /**
                         *这里进行接收消息
                         * */
                        xmppConnection.addPacketListener(new PacketListener() {
                            //如果服务器发消息给客户端则执行下面的方法
                            @Override
                            public 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() {
                                                @Override
                                                public 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);

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

xmppConnection.addPacketListener(new PacketListener() 

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

CharActivity.instance.runOnUiThread(new Runnable()

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

 private Handler handler = new Handler() {
        @Override
        public 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;
            }
        }
    };

执行:

handler.sendEmptyMessage(0);

效果图:

   
关于asmack框架的聊天简单的介绍就这么多,后面会推出基于融云的SDK进行的第三方SDK的即时通讯的实现,这里的基于asmack框架是大致的简介一下具体的单聊文件发送这些共功能的实现可后期进行完善比如单聊:
/**
	 * 发送消息
	 *
	 * @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 block
			e.printStackTrace();
		}
	}
最后谢谢大家的支持,别忘记扫描头像关注公众号进行“激情裸聊”谢谢大家~~~~~~!










时间: 2024-08-13 14:15:45

基于asmack的聊天的相关文章

XMPP(二)-基于asmack+openfire的安卓客户端(仿QQ)的介绍以及个人心得

关于XMPP第一篇-openfire的搭建写完后,就一直在赶本篇所要介绍的这个基于asmack+openfire的安卓客户端,费了不少精力,因为有不少同学在还在焦急的等待着(自恋了呵呵),所以紧赶慢赶,现在算做出来了一个比较初级的版本,很多功能还不完善,不过先放出来,供大家一起参考研究,提出问题,共同学习,当然,该项目本人是会不断完善,增加新功能,甚至到后来的群组,有兴趣的话,大家可以继续关注^-^ 好了,接下来介绍下本项目实现的功能吧: 1.注册: 2.登录: 3.依昵称查找人员: 4.添加好

基于XMPP协议聊天程序【Openfire+asmark】

    本文章提供了实现IM聊天程序最基础的配置和使用案例,可以实现点对点聊天.可做为入门阅读使用.文章转载请注明来源:http://blog.csdn.net/fengfeng91 一:搭建服务器: 官方网站下载openfire服务器安装.配置密码,权限,数据库(内置数据库或者添加外部数据库支持Mysql) 注意* 如果配置外部数据库,需先保证数据库服务已被开启,才能保证服务器开启. Windows环境下开启抛出异常/乱码时,关闭服务器,以管理员身份运行,当出现以下提示时,表示服务器启动成功.

【Java网络编程】基于UDP的聊天通信

使用udp协议,写一个基于命令行的聊天软件:客户端跟服务端分别在命令行启动之后,客户端和服务器端可以互相发送数据. 一.创建线程 sendThread 和receiveThread 1 package com.fhcq.chat; 2 3 //双工的聊天程序 4 //可以发送数据,同时也可以等待接收数据 5 //需要使用多线程来实现 6 7 public class QICQDemo { 8 9 public static void main(String[] args) { 10 // TOD

基于java的聊天室/群发控制台程序

java聊天室 1.概述 基于tcp协议的,由一个服务器和多个客户端组成,一个客户端发送消息,其他所有客户端都能接收到消息.在服务器端设置一个线程监听客户端发来的请求(消息),并且向所有的客户端响应.每个客户端也有一个线程用来接收服务器端的请求. 2.代码如下 public class Client { public static void main(String[] args) throws IOException { //创建套接字 Socket socket = new Socket("l

基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件[转]

上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfire插件.一步步很详细的介绍到简单插件开发,带Servlet的插件的开发.带JSP页面插件的开发,以及怎么样将开发好的插件打包.部署到openfire服务器. 如果你没有看上一篇文章的话,请你还是看看.http://www.cnblogs.com/hoojo/archive/2013/03/07/2947502.html 因为这篇文章是基于上篇文章讲叙的基础上完成插件开发.而且

【转】iOS基于WebSocket的聊天机制

原文网址:http://www.jianshu.com/p/21d9b3b94cfc WebSocket 的使得浏览器提供对 Socket 的支持成为可能,从而在浏览器和服务器之间提供了一个基于 TCP 连接的双向通道.Web 开发人员可以非常方便地使用 WebSocket 构建实时 web 应用. 1.WebSocket 机制 以下简要介绍一下 WebSocket 的原理及运行机制. WebSocket 是 HTML5 一种新的协议.它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带

基于java网络聊天室---前言

很久之前做的一个东西,现在拿出来整理一下放在自己的博客中! 一. 设计目的 随着人互联网的发展,人和人之间的沟通方式也越来越便捷和多样化,在线聊天工具已经成为人们生活中够通不可缺少的部分,在学习完 java网络编程课程,如果能开发一款属于自己的聊天工具,和好友进行私密对话,则是一件令人兴奋的事.同时,安全可靠的TCP这两种 通信协议,是非常重要的内容,值得研究. 二. 设计内容 本聊天室程序基于C/S模式,聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登陆

从零开始优化基于RuleBased的聊天机器人

这里记录从最基础的基于规则的聊天机器人,升级到基于逻辑的机器人,再升级到调用Google提供的API来让机器人能说.会听普通话. 最基本的完全基于规则式的问答:问什么就答什么,幼儿园水平. import random # 打招呼greetings = ['hola', 'hello', 'hi', 'Hi', 'hey!','hey']# 回复打招呼random_greeting = random.choice(greetings) # 对于"你怎么样?"这个问题的回复question

基于SSH的聊天室

随网络聊天室是用户比较喜欢的一种WEB应用程序,借助聊天室,用户可以及时互通信息,交流思想.本系统主要采用了基于B/S(Browser/Server,即浏览器/服务器)模式开发的简易聊天室系统.本系统主要是采用了S2SH技术和JSP技术开发的动态网站.系统开发主要包括前台页面设计.功能设计和后台数据处理设计(即发言区管理和用户管理). 本系统采用了MYECLIPSE8.5作为开发工具,后台数据库采用了MYSQL数据库设计,利用JAVA的框架技术S2SH和后台数据处理.利用TOMCAT6.0以上的