Android IM实践

IM(Instant Messaging)在Android中可谓运用广泛。QQ,Wechat,陌陌等应用都可以看作IM实时通讯APP,实时通讯在社交类APP中运用范围较广,其功能看起来也是比较cool的。今天我们将研究一下android IM软件是如何实现的。像IM这种实施通讯软件,除非公司有比较大的实力和精力,才会自己去整这么一套框架。对于广大中小软件开发者来说,想到比较多的就是开源框架。Opensource对于开发者来说简直就是福音,对于整个软件行业也起到了不小的推动性的作用。

Openfire在这种环境下应运而生,而且作为实时通讯类开源框架迅速走红,下面我们就一起来学习这样一款拯救宇宙的开源框架,文章的最后会运用Openfire做出一个可以实时通讯的AndroidAPP,如果结合上地理位置再多点UI和交互上的设计提升,这不就是陌陌吗?YY了一会,觉得挺有趣,那么 Just do it

Openfire概念性介绍请点击:http://blog.csdn.net/ithomer/article/details/7192257

Openfire官网:http://www.igniterealtime.org/

Openfire安装文档:http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/install-guide.html

1. 选择服务器

对于实时通讯软件,除了我们的客户端,服务器端更是关键。因为服务器是连接两个会话的桥梁。根据安装文档中,Openfire提供了多个平台的安装版本。Windows, Linux/Unix。所以支持还是很丰富的。至于服务器的选择我们可以选择自己的ECS,本地PC,或者Linux虚拟机。选择本机安装的请略过此步骤。

为了更加符合真实的安装环境,我选择本地的Linux虚拟机作为服务器环境。方便以后部署到真实的服务器环境中。

在进行下一步之前请先在server上安装mysql和java。

2. Install openfire

从官网上下载对应的版本,我这里选择Openfire_3.9.3 Linux版本,登陆服务器后直接使用wget下载

wget http://www.igniterealtime.org/downloadServlet?filename=openfire/openfire-3.9.3-1.i386.rpm

//下载完成后使用rpm进行安装

rpm -ivh openfire-3.9.3-1.i386.rpm

Openfire安装完成后会在/opt目录下生成openfire/目录。

安装完成后就需要进行数据库的配置,按照官方文档:

Make sure that you are using MySQL 4.1.18 or later (5.x recommended) 1.
Create a database for the Openfire tables:
mysqladmin create [databaseName]
(note: "databaseName" can be something like ‘openfire‘)
Import the schema file from the resources/database directory of the installation folder:
Unix/Linux: cat openfire_mysql.sql | mysql [databaseName];
Windows: type openfire_mysql.sql | mysql [databaseName];
Start the Openfire setup tool, and use the appropriate JDBC connection settings.

首先使用mysqladmin create openfire创建名为openfire的数据库, cd /opt/openfire/resources/database进入openfire的数据库资源目录,使用cat openfire_mysql.sql | mysql openfire导入openfire的schema数据库文件。

3. 启动Openfire服务

使用rpm安装完成后的openfire会在/etc/init.d/中自动生成openfire 文件,可以直接在这里打开服务.

Usage /etc/init.d/openfire {start|stop|restart|status|condrestart|reload}

运行openfire服务:/etc/init.d/openfire start,运行/etc/init.d/openfire status显示没有成功运行。

查看log cat /opt/openfire/logs,显示nohup: cannot run command /opt/openfire/jre/bin/java: No such file or directory,看来openfire找不到java,所以不能成功启动,但是我们的系统的确已经安装了java,所以可以通过软链解决:

cd /opt/openfire/jre/bin
cp java java.bak
rm java
ln -s /usr/bin/java java
service openfire start

软链完成之后,再次开启openfire服务:

[root@iZ23572i0rtZ bin]# /etc/init.d/openfire status
openfire is not running
[root@iZ23572i0rtZ bin]# /etc/init.d/openfire start
Starting openfire:
[root@iZ23572i0rtZ bin]# /etc/init.d/openfire status
openfire is running

status显示openfire已经成功启动。通过虚拟机ip访问9090端口,这时会跳转到setup界面,只需要通过setup便可以完成相关配置。

配置完成之后即可以登录自己的管理控制台。

4. Integrate to Android

既然服务器安装完成,那我们可以着手我们的APP。与Openfire关联的客户端XMPP协议库是smack。摸索一番之后发现,要在Android中使用Smack必须使用ASmack库。ASmack下载地址

以实例为主,通过smack实现两个客户端之间的即时通信。下载地址

Attention

  • 在AndroidManifest中必须添加Internet permission,否则连接失败。<uses-permission android:name="android.permission.INTERNET"/>.
  • 客户端对客户端创建聊天时,SID为 [email protected], XXXX表示的是服务器名字,我这里是ECS主机名。

5. Github Repository

https://github.com/gongmingqm10/SmackDemo

时间: 2024-11-13 10:14:46

Android IM实践的相关文章

Android开发实践:Android交叉编译工具链的使用

前面2篇文章分别介绍了Android NDK编译的命令行参数,以及如何在任意目录使用Android.mk来编译本地c/c++代码,Andriod.mk和ndk-build只不过是Android官方提供了一套封装过的Android交叉编译环境而已,其实,你可以不用它,而直接通过传统的Makefile文件来编译你的c/c++代码的,本文即介绍如何直接通过传统的Makefile文件来编译可用于Android平台的库文件. 经常搞嵌入式开发的朋友对于交叉编译环境应该并不陌生,说白了,就是一组运行在x86

Android开发实践:利用ProGuard进行代码混淆

由于Android的代码大都是Java代码,所以挺容易被反编译的,好在Android ADT为我们集成了混淆代码的工具,一来可以混淆我们的代码,让程序被反编译后基本看不懂,另外还能起到代码优化的作用.发布项目前,建议打开Android的代码混淆功能. Android ADT主要通过ProGuard工具来提供代码混淆,网上也有挺多博客文章讲这个的,但感觉很多都介绍得太过于复杂,这里我就以问答的方式来更加简洁地介绍下ProGuard吧. 1. ProGuard是什么 ProGuard是一个工具,用来

Android开发实践:WIFI连接功能的封装

在上一篇文章<Android开发实践:WIFI扫描功能的封装>介绍了如何利用Andriod的API实现WIFI的扫描,本文则重点讲述一下如何连接WIFI吧,在此,也给出一个封装WIFI连接过程的类,提供简单的接口以供在各个代码工程中复用. 与WIFI扫描类似,WIFI的连接同样是一个耗时的过程,所以需要放到线程中执行,通过回调来通知调用者连接结果.该回调接口的定义如下: public interface WifiConnectListener { public void OnWifiConne

Android动画实践结论

实践出真知: 一>平移动画 overridePendingTransition(R.anim.enterAnim,R.anim.exitAnim); 方法中第一个参数表示进enterAnim,第二个参数表示出exitAnim:怎么理解呢? 比如:如果我写出这样的一个效果,如同在网易新闻上的一样.当你点击一条新闻的时候,好像当前页面不动,然后所请求的新闻页面从右向左逐渐平移过来并完全遮掩(覆盖)当前页面.如果实现它,看XML代码: /** enterAnim */ <?xml version=&

Android开发实践:由new Handler()说开去

最近面试一些Android开发的应聘者,除了基本的Activity生命周期等基础问题以外,我一般还会问如下两个问题: (1) Service与Thread有什么区别? (2) 在Activity里new Handler()和在自己创建的Thread中new Handler()有什么区别? 第一个问题其实是一个伪命令,因为Service是Android四大组件之一,而Thread只是Java提供的一个封装了线程管理的工具类,无论是Activity还是Service,都可以通过Thread来创建一个

Android开发实践:为什么要继承onMeasure()

Android开发中偶尔会用到自定义View,一般情况下,自定义View都需要继承View类的onMeasure方法,那么,为什么要继承onMeasure()函数呢?什么情况下要继承onMeasure()?系统默认的onMeasure()函数行为是怎样的 ?本文就探究探究这些问题. 首先,我们写一个自定义View,直接调用系统默认的onMeasure函数,看看会是怎样的现象: package com.titcktick.customview; import android.content.Con

Android开发实践:Java层与Jni层的数组传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni层也需要把从Socket接收到的数据流返回给Java层.我简单地总结了一下,从Java层到Jni层,从Jni层到JAVA层,各有3种传递方式,下面用代码示例简单地介绍一下. 示例代码的主要文件有两个,一个是Native.java,是Java层的类:另一个是Native.c,是JNI层的文件,关键的地

Android开发实践:以“专业”的态度处理多线程

刚开始学一门编程语言的时候,我总是会有一种困惑,怎样让自己的代码看起来更"专业"?很多时候,我们可以照着教材实现一些基本的功能,比如用Socket发送/接收几个字符,写一个线程完成某个异步任务,但是在实际的项目中,往往不那么简单,比如需要设计Socket通信协议,需要处理Socket的连接异常断开,需要考虑在线程阻塞的情况下如何正常退出和释放资源等等,关于这些"实战经验",前面的文章也有所涉及,以后有空准备再开个专题跟大家分享探讨一下,今天先简单地说说怎样更&quo

Android最佳实践之高效的应用导航

设计(一)- 规划Screens和他们之间的关系 原文地址:http://developer.android.com/training/design-navigation/screen-planning.html#beyond-simplistic-design 设计和开发Android应用程序的第一个步骤是确定用户能够查看和处理应用.一旦你知道用户与之交互的应用程序之间交互什么数据,下一步就是设计交互,允许用户导航到app的不同部分,进入和退出应用程序中的界面. 这篇文章开始向你展示如何规划高

Android最佳性能实践(三)——高性能编码优化

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/42318689 在前两篇文章当中,我们主要学习了Android内存方面的相关知识,包括如何合理地使用内存,以及当发生内存泄露时如何定位出问题的原因.那么关于内存的知识就讨论到这里,今天开始我们将学习一些性能编码优化的技巧. 这里先事先提醒大家一句,本篇文章中讨论的编码优化技巧都是属于一些"微优化",也就是说即使我们都按照本篇文章的技巧来优化代码,在性能方面也是看不出有什么