您的位置:首页 > 移动开发 > Android开发

android利用xmpp进行即时通信

2016-01-13 21:37 567 查看

简单介绍:什么是即时通信?类似于QQ聊天一样,不对,介绍理论不是我的风格,直接进入主题!

现在比较常用的软件是OpenFire做服务器,Spark做测试客户端(这是通用的,也有的公司是自己做的例如QQ)

下载地址:http://www.igniterealtime.org/downloads/index.jsp

OpenFire安装指导:http://www.tuicool.com/articles/bYfeAnU

设置OpenFire网址:http://127.0.0.1:9090 (这里也可以根据安装指导去做,但是我用的时候,有时会碰到OpenFire打不开的情况 )

需要的Jar包:

下载地址:http://download.csdn.net/detail/zhengyikuangge/9402975

①添加权限(AndroidMainfest.xml)

<uses-permission android:name="android.permission.INTERNET" />


②连接OpenFire服务器和发送数据代码方法:

public static XMPPConnection conn;
//声明一个全局变量

public void send() throws XMPPException {
ConnectionConfiguration cc = new ConnectionConfiguration(
"192.168.56.1", 5222);
//第一个参数为IP地址,第二个参数为端口号
conn = new XMPPConnection(cc);
//创建连接对象
conn.connect();
//开始连接......
conn.login("zhangwenqi", "154211");
//账号和密码 在OpenFire中创建的账号和密码
Chat chat = conn.getChatManager().createChat(
"zhang" + "@" + conn.getServiceName()
/*创建一个聊天窗口,‘zhang’是接收方的名
字,conn.getServiceName()是服务器名字*/,
new MessageListener() {

@Override
public void processMessage(Chat arg0, Message arg1) {
// TODO Auto-generated method stub
Log.e("111", arg1.getBody() + "1542");
// 返回接收数据,重复接收
}
});
Message msg = new Message();
msg.setBody("zwq");
/* 注意这里的message是
org.jivesoftware.smack.packet.Message
是专门用于xmpp即时通讯使用的*/
chat.sendMessage(msg);
//发送数据
}


③创建一个线程执行②中的方法即可。

这是费了一天的时间才研究出来的,多亏以前学过连接web服务器要不然今天是够呛啊,明天再研究研究然后再完善~~

安卓客户端实现在OpenFire服务器注册用户:

/**
* 注册
*
* @param account 注册帐号
* @param password 注册密码
* @return 1、注册成功 0、服务器没有返回结果2、这个账号已经存在3、注册失败
*/
public String regist(String account, String password) {
if (conn == null)
return "0";
Registration reg = new Registration();
reg.setType(IQ.Type.SET);
reg.setTo(conn.getServiceName());
// 注意这里createAccount注册时,参数是username,不是jid,是“@”前面的部分。
reg.setPassword(password);
reg.addAttribute("android", "geolo_createUser_android");
// 这边addAttribute不能为空,否则出错。
// 所以做个标志是android手机创建的吧!!!!!
PacketFilter filter = new AndFilter(new PacketIDFilter(
reg.getPacketID()), new PacketTypeFilter(IQ.class));
PacketCollector collector = conn.createPacketCollector(filter);
conn.sendPacket(reg);
IQ result = (IQ) collector.nextResult(SmackConfiguration
.getPacketReplyTimeout());
// Stop queuing results
collector.cancel();// 停止请求results(是否成功的结果)
if (result == null) {
Log.e("RegistActivity", "No response from server.");
return "0";
} else if (result.getType() == IQ.Type.RESULT) {
return "1";
} else { // if (result.getType() == IQ.Type.ERROR)
if (result.getError().toString().equalsIgnoreCase("conflict(409)")) {
Log.e("RegistActivity", "IQ.Type.ERROR: "
+ result.getError().toString());
return "2";
} else {
Log.e("RegistActivity", "IQ.Type.ERROR: "
+ result.getError().toString());
return "3";
}
}
}


这段代码的原地址:

http://blog.csdn.net/h7870181/article/details/8653865

感觉挺不错的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: