闲暇之余,自己写了个简单的即时通讯,基于OpenFire服务器平台。

整个项目包括两个部分,一个是服务器端,一个是android手机端;

一、关于服务器端没什么好说的,下载安装配置即可

推荐下载带jar的程序安装,配置好java_jdk的可以使用压缩包解压安装

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

顺便下载一个Spark,电脑端通讯,用于和你的安卓手机互发信息。

运行openFire截图

openfire的后台管理界面:

二、重点介绍一下android端的程序

1、首先要连接到OpenFire服务器,需要一个登陆界面,像这样

连接服务器的代码:

Thread thread = new Thread(new Runnable() {
    public void run() {
        try {
            // 连接服务器
            XmppConnection.getConnection().login(userStr, passStr);
            // 连接服务器成功,更改在线状态
            Presence presence = new Presence(Presence.Type.available);
            XmppConnection.getConnection().sendPacket(presence);
            handler.sendEmptyMessage(1);
        } catch (XMPPException e) {
            XmppConnection.closeConnection();
            handler.sendEmptyMessage(2);
        }
    }
});
thread.start();

XmppConnection类的核心代码

;// 端口

public static String SERVER_HOST = "192.168.1.169";// 服务器地址

public static String SERVER_NAME = "@8nqa3d40s88hspl";// 服务器名称

private static XMPPConnection connection;

private static FileTransferManager fileManager;

private static void openConnection() {
    try {
        if (null == connection || !connection.isAuthenticated()) {
            XMPPConnection.DEBUG_ENABLED = true;
            ConnectionConfiguration conConfig = new ConnectionConfiguration(
                    SERVER_HOST, SERVER_PORT, SERVER_NAME);
            conConfig.setReconnectionAllowed(true);
            conConfig.setSendPresence(true);
            conConfig.setSASLAuthenticationEnabled(true);
            connection = new XMPPConnection(conConfig);
            connection.connect();
            configureConnection();
        }
    } catch (XMPPException e) {

    }
}

public static XMPPConnection getConnection() {
    if (connection == null) {
        openConnection();
    }
    return connection;
}
public static void closeConnection() {
    if(connection != null){
        connection.disconnect();
        connection = null;
    }
}

2、连接到服务器之后,获取我们的好友,像这样

获取好友列表的代码:

Thread thread = new Thread(new Runnable() {
    public void run() {
        try {
            XMPPConnection conn = XmppConnection.getConnection();
            Roster roster = conn.getRoster();
            friendList = new ArrayList<Map<String,String>>();
            Collection<RosterEntry> entries = roster.getEntries();
            HashMap<String, String> map = null;
            for (RosterEntry entry : entries) {
                map = new HashMap<String, String>();
                map.put("User", entry.getUser());
                map.put("Name", entry.getName());
                friendList.add(map);
            }
            handler.sendEmptyMessage();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
thread.start();

3、聊天界面的程序,像这样

Spark聊天界面

接受消息的代码:

private ChatManager chatMan;
private Chat newchat;
// 消息监听
chatMan = XmppConnection.getConnection().getChatManager();
newchat = chatMan.createChat(toUserID, null);
chatMan.addChatListener(new ChatManagerListener() {
    @Override
    public void chatCreated(Chat chat, boolean able) {
        chat.addMessageListener(new MessageListener() {
            @Override
            public void processMessage(Chat chat, Message message) {
                // 收到来自pc服务器的消息(获取自己好友发来的信息)
                if (message.getFrom().contains(toUserID)) {
                    if (message.getBody().length() > 0) {
                        // 获取用户、消息、时间、IN
                        String[] args = new String[] { toUserID,
                                message.getBody() };
                        // 在handler里取出来显示消息
                        android.os.Message msg = handler
                                .obtainMessage();
                        msg.what = 1;
                        msg.obj = args;
                        msg.sendToTarget();
                    }
                }
            }
        });
    }
});

发送消息的代码:

// 发送消息
String fromUserID = mAppGlobal.getName();
String dateStr = DateTimeUtils.formatDate(new Date());
chatList.add(new Msg(dateStr, fromUserID, content, "OUT"));
// 刷新适配器
mAdapter.notifyDataSetChanged();
mListView.setSelection(ListView.FOCUS_DOWN);//刷新到底部
Thread thread = new Thread(new Runnable() {

    @Override
    public void run() {
        try {
            Message msg = new Message();
            msg.setBody(content);
            // 发送消息
            newchat.sendMessage(msg);
        } catch (XMPPException e) {
            e.printStackTrace();
        }
    }
});
thread.start();
etSend.setText("");

源码送上:http://files.cnblogs.com/files/pear-lemon/XmppTest.zip

Android基于XMPP的即时通讯1-基本对话的更多相关文章

  1. Android基于XMPP的即时通讯3-表情发送

    这篇博文主要讲表情发送的一些东西. 参考:Android基于XMPP的即时通讯1-基本对话 1.准备好资源文件 采用的是emoji的表情,我打包好了,下载地址:http://files.cnblogs ...

  2. Android基于XMPP的即时通讯2-文件传输

    本文是在上一篇博文Android基于XMPP的即时通讯1-基本对话的基础上,添加新的功能,文件传输 1.初始化文件传输管理类 public static FileTransferManager get ...

  3. Android基于xmpp的即时通讯应用

    xmpp是一个通信协议.因为这是个开放的协议,为了节俭开发成本,很多即时应用都采用了这个协议.Android上最常用的组合asmack +openfire.Asmack是smack的android版, ...

  4. 【XMPP】基于XMPP的即时通讯解决方案

    什么是XMPP 介绍XMPP之前,先来看看GTalk. GTalk是Google推出的IM(Instant Messaging,即时通讯)软件,类似于QQ和MSN. 从技术角度来说,GTalk与QQ和 ...

  5. iOS基于XMPP实现即时通讯之一、环境的搭建

    移动端访问不佳,请访问我的个人博客 使用XMPP已经有一段时间了,但是一直都没深入研究过,只是使用SDK做一些简单的操作,看了许多大神的博客,自己总结一下,准备写一系列关于XMPP的使用博客,以便于自 ...

  6. Android基于XMPP Smack openfire 开发的聊天室

    Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...

  7. android环境下的即时通讯

    首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...

  8. 基于openfire+smack即时通讯instant message开发

    前言 Java领域的即时通信的解决方案可以考虑openfire+spark+smack.当然也有其他的选择. Openfire 是基于Jabber协议(XMPP)实现的即时通信服务器端版本,目前建议使 ...

  9. [Python]实现XMPP协议即时通讯发送消息功能

    #-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = 'che ...

随机推荐

  1. hdu 4753 2013南京赛区网络赛 记忆化搜索 ****

    看到范围基本可以想到dp了,处理起来有点麻烦 #include<iostream> #include<cstdio> #include<cstring> #incl ...

  2. [Linux] 解压tar.gz文件,解压部分文件

    遇到数据库无法查找问题原因,只能找日志,查找日志的时候发现老的日志都被压缩了,只能尝试解压了   数据量比较大,只能在生产解压了,再进行查找 文件名为*.tar.gz,自己博客以前记录过解压方法: h ...

  3. OC对象的动态和静态构造区别

    Student.h: #import <Foundation/Foundation.h> @interface Student : NSObject @property(nonatomic ...

  4. Codeforces Beta Round #77 (Div. 1 Only) C. Volleyball (最短路)

    题目链接:http://codeforces.com/contest/95/problem/C 思路:首先dijkstra预处理出每个顶点到其他顶点的最短距离,然后如果该出租车到某个顶点的距离小于等于 ...

  5. Mysql怎样取消错误命令

    1.补上分号. 2.quit 3.由于Mysql中,‘号和"号都是成对出现的,故当错误键入'号或"号时,需要补全另一半才能退出.

  6. MySQL的多表查询(笛卡尔积原理)

    先确定数据要用到哪些表. 将多个表先通过笛卡尔积变成一个表. 然后去除不符合逻辑的数据(根据两个表的关系去掉). 最后当做是一个虚拟表一样来加上条件即可. 注意:列名最好使用表别名来区别. 笛卡尔积 ...

  7. poj1745 dp

    题目链接:http://poj.org/problem?id=1745 类似的题目之前写过一个差不多的(链接:http://www.cnblogs.com/a-clown/p/5982611.html ...

  8. jquery的siblings()

    jquery 点击 感兴趣 感兴趣变为 蓝色 去掉onclick事件 不感兴趣 变为 黑色 加上点击事件 点击 不感兴趣 不感兴趣变为 蓝色 去掉onclick 感兴趣 变为 黑色 加上点击事件 ht ...

  9. POJ1201 Intervals差分约束系统(最短路)

    Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a p ...

  10. 1.ARC和非ARC文件共存

    1.ARC和非ARC文件共存 项目->Build Parses->对应的类 1.1.新项目兼容老的非ARC:-fno-objc-arc 1.2.老项目兼容ARC:-fobjc-arc