openfire+asmack搭建的安卓即时通讯(一) 15.4.7
最进开始做一些android的项目,除了一个新闻客户端的搭建,还需要一个实现一个即时通讯的功能,参考了很多大神成型的实例,了解到operfire+asmack是搭建简易即时通讯比较方便,所以就写了这篇博客。
一、基础知识(这是复制别人的)
XMPP协议简介
XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的。它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍。利用XMPP作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信。
这篇文章有基本的介绍,http://blog.csdn.net/xutaozero21/article/details/4873439
IM
Instant Messenger,及时通信软件,就是大家使用的QQ、MSN Messenger和Gtalk等等。其中Gtalk 就是基于XMPP 协议的一个实现,其他的则不是。当前IM 几乎作为每个上网者必然使用的工具,在国外的大型企业中有一些企业级的IM应用,但是其商业价值还没完全发挥出来。设想既然XMPP 协议是一个公开的协议,那么每个企业都可以利用它来开发适合本身企业工作,提高自身生产效率的IM;甚至,你还可以在网络游戏中集成这种通信软件,不但让你可以边游戏边聊天,也可以开发出适合游戏本身的IM 应用,比如说一些游戏关键场景提醒功能,团队语音交流等等都可以基于IM来实现。
本文主要讲解在android使用xmpp协议进行即时通信,所涉及3个主要的东西,它们是openfire、smack和spark,这个三个东东结合起来就是完整的xmpp IM实现,这里简单介绍一下这3个东东在下文的作用:
openfire主要是作为服务器,负责管理客户端的通信连接,以及提供客户端一些通信信息和连接信息。
Smack主要是xmpp协议的实现,提供了一套很好的api,所以下面操作xmpp都是通过使用smack的api来实现,当然因为是在android里,所以使用的是asmack这个包,里面方法跟smack包差不多。
Spark 是IM客户端的实现,其实就是使用了smack 的api实现的。
Openfire的安装和配置:
可参考http://www.cnblogs.com/hoojo/archive/2012/05/17/2506769.html
二、实现第一步登录
做好了一系列的前期准备之后我们就能看到这样的用户后台管理了,其中注册了两个用户用来测试。
1.首先可以搭建简易的样式:
够丑吧=-=
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView
android:id="@+id/textview"
android:text="@string/hello_world"
android:textSize="48dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TableLayout
android:layout_below="@id/textview"
android:id="@+id/tablelayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow>
<TextView
android:layout_height="wrap_content"
android:text="Name:"
/>
<EditText
android:id="@+id/login_name"
android:hint="Input your Name "
android:layout_height="wrap_content"
/>
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:text="Password:"
/>
<EditText
android:id="@+id/login_password"
android:hint="Input your Password "
android:layout_height="wrap_content"
/>
</TableRow>
</TableLayout>
<Button
android:id="@+id/buttonlogin"
android:layout_below="@id/tablelayout"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:text="login in"/>
</RelativeLayout>
一个标题,两个输入,一个Login in的按钮够简单吧!!
2.代码实现:
首先将一些要用的方法封装到工具类里。
public class connect {
private static ConnectionConfiguration connConfig;
private static XMPPConnection con; public static XMPPConnection getConnection() {//获取连接
if (con == null || !con.isConnected()) {
openConnection();
}
return con;
}
public static boolean openConnection() {//连接方法
try {
connConfig = new ConnectionConfiguration("192.168.252.1", 5222); //5222是客户端和服务端的连接端口,其中的ip是我的内网ip
// 设置登录状态为离线
connConfig.setSendPresence(false);
// 断网重连
connConfig.setReconnectionAllowed(true);
con = new XMPPConnection(connConfig);
con.connect();
return true;
} catch (Exception e) {
// TODO: handle exception
}
return false;
}
public static void closeConnection() {//断开连接
con.disconnect();
}
public static boolean login(String account, String password) {
try {
if (connect.getConnection() == null)
return false;
/** 登录 */
SASLAuthentication.supportSASLMechanism("PLAIN", 0);
connect.getConnection().login(account, password);
// 设置登录状态:在线
// Presence presence = new Presence(Presence.Type.available);
// connect.getConnection().sendPacket(presence);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public class MainActivity extends ActionBarActivity implements View.OnClickListener {//主函数
public static final int FAIL_CON=0;
public static final int SUCC_CON=0;
private String Tag = "MainAcy";
private String account;
private String pwd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //绑定按钮
findViewById(R.id.buttonlogin).setOnClickListener(this); } private android.os.Handler insHandler = new android.os.Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
// 登录成功
case 1:
Toast.makeText(MainActivity.this,"SUCCESS",Toast.LENGTH_SHORT).show();
Log.d(Tag, "login suc");
//跳转页面
Intent intent=new Intent();
intent.putExtra("usename", account);
//传值
intent.setClass(MainActivity.this, useractivity.class);
startActivity(intent);
break;
case 0:
Toast.makeText(MainActivity.this,"FAIL",Toast.LENGTH_SHORT).show();
Log.d(Tag, "login fail");
accountLogin();
default:
break;
}
}
}; private void accountLogin() {
new Thread() {
public void run() {
account = ((EditText) findViewById(R.id.login_name))
.getText().toString();
pwd = ((EditText) findViewById(R.id.login_password)).getText()
.toString();
boolean is = ConnecMethod.login(account, pwd);
if (is) {
insHandler.sendEmptyMessage(1);
// 保存用户名
user.UserName = account;
} else {
insHandler.sendEmptyMessage(0);
}
};
}.start();
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.buttonlogin:
accountLogin();
default:
break;
}
}
}
我们为下一个页面传递了一个值就是我们登陆的用户名,所以在用户页面要:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.useractivity);
Intent intent =getIntent();
String username=intent.getStringExtra("usename");//接收用户名
TextView textView= (TextView) findViewById(R.id.username);再体现在用户页的一个textiew里
textView.setText(username);
connect.closeConnection();
//使用的连接服务要在登录成功后,即时销毁,否则下一次就会登陆错误。
}
这就是第一步的完成,近期不忙就会做下一步的完成。
openfire+asmack搭建的安卓即时通讯(一) 15.4.7的更多相关文章
- openfire+asmack搭建的安卓即时通讯(三) 15.4.9
(能用得上话的话求点赞=-=,我表达不好的话跟我说哦) 上一次我们拿到了服务器端的组数据和用户信息,这就可以为我们日后使用好友系统打下基础了! 但是光是拿到了这些东西我们怎么能够满足呢?我们一个即时通 ...
- openfire+asmack搭建的安卓即时通讯(七) 15.5.27
本地化之章! 往期传送门: 1.http://www.cnblogs.com/lfk-dsk/p/4398943.html 2.http://www.cnblogs.com/lfk-dsk/p/441 ...
- openfire+asmack搭建的安卓即时通讯(四) 15.4.10
之前的教程不知道你们成功了没,,,没成功可以问我啊=-= 第四篇博文是要实现发送消息的功能. 首先在我们登陆后的活动的layout里添加这样的两个控件,一个EditText和一个Button用于发送数 ...
- openfire+asmack搭建的安卓即时通讯(六) 15.4.16
啊啊啊啊啊啊啊啊,这东西越做越觉得是个深坑啊! 1.SharedPreferences.Editor的密码保存和自动登录: 首先还是从主界面开始,因为要提升一下用户体验自然要加入保存密码和自动登录的功 ...
- openfire+asmack搭建的安卓即时通讯(五) 15.4.12
这一篇博客其实是要昨天写的,但昨天做了作修改就停不下来了,这次的修改应该是前期开发的最终回了,其余的功能有空再做了,下周可能要做一些好玩的东西,敬请期待! 1.修改下Logo:(Just We) ht ...
- openfire+asmack搭建的安卓即时通讯(二) 15.4.9
上期没有放成果图呢!忘了=-=,这就是上次的成果图,textview里面会显示登陆的名字(这个是默认管理员帐号=-=) 好吧,登陆了服务器我们就有了交互的功能啦可以说是前进了一大步呢!下面能我们就要试 ...
- Openfire XMPP Smack RTC IM 即时通讯 聊天 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- XMPP(三)-安卓即时通讯客户端
由于时间原因,所以更新比较慢 ,还请大家谅解,此次是对上篇文章中的安卓客户端初级版本进行的一次更新优化,在这次更新后,就有那么一点样子了,可以拿的出手了,呵呵,还在关注的同学也可以及时下载更新.此次主 ...
- 急急如律令!火速搭建一个C#即时通信系统!(附源码分享——高度可移植!)
(2016年3月更:由于后来了解到GGTalk开源即时通讯系统,因此直接采用了该资源用于项目开发,在此对作者表示由衷的感谢!) —————————————————————————————————— 人 ...
随机推荐
- Unity3D脚本语言UnityScript初探
译者注: Unity3D中支持三种语言:JavaScript.C#.Boo,很多人不知道如何选择,通过这篇译文,我们可以搞清楚这三者语言的来龙去脉,对选择主语言有一定的借鉴意义. 首先,Unity是基 ...
- SharePoint 2013 新功能探索 之 列表等级设置
一.列表等级及赞功能 ,在SharePoint 2010 中,对列表的等级设定,需要一定时间才能看到,现在可以实时同步,评分人数也能显示出来 等级分为两类 赞和星级评定
- jQuery Flipping Gallery 翻转画廊
在线实例 简单配置 翻转方向 鼠标滚动 自动播放 绑定事件 使用方法 <div class="main"> <div class="page_conta ...
- 删除src值为空的img标签
今天刚刚完成了一个官网的前后台整站建设,虽然不是很复杂,但感觉获益良多.由于涉及到一点后台问题,所以期间遇到了不少问题.学到的东西,得作个总结.今天先讲讲img的路径问题.由于现在很多网站喜欢全屏大图 ...
- 使用NPOI将多张图片导入execl
protected void btn_Export_Click(object sender, EventArgs e) { List<BNXX_SJXJ_XJSJ> list = View ...
- 独立博客开张!有关读书、GTD和IT方面的内容将发布在新网站上
2015年自己建个独立博客http://www.shenlongbin.com,以后与读书.GTD和IT技术有关的主题都放在个人博客中,2015年计划基本制定,请移步到这里. 感谢博客园提供了如此优秀 ...
- 解析XML的几种方法之SAX解析
假期总结不能停,坚持坚持....接下来总结一下XMl和json的解析和生成.. 解析XML的四种方法,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址: DOM:在现 ...
- Effective Java 阅读笔记——方法
38:检查参数的有效性 每当编写方法或者构造器的时候,应该考虑它的参数有哪些限制,在方法的开头处对参数进行检查,并且把这些限制写入文档. 注意: 对于公有方法,应该使用@throws标签在文档中说明违 ...
- App开发流程之数据持久化和编译静态链接库
先记录数据持久化. iOS客户端提供的常用数据持久化方案:NSUserDefaults代表的用户设置,NSKeydArchiver代表的归档,plist文件存储,SQLite数据库(包括上层使用的Co ...
- Undefined symbols for architecture i386:和"_OBJC_CLASS_$_xx", referenced from:问题解决方法
多个人共同操作同一个项目或拷贝项目时,经常会出现类似这样的问题: Undefined symbols for architecture i386: "_OBJC_CLASS_$_xx文件名& ...