闲暇之余,自己写了个简单的即时通讯,基于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. php 常见的问题

    1. this指针错误的引用变量($(php)<->*(c)) $this->inputData right wrong 2. json_encode(array) 不一定按数组关键 ...

  2. Socket编程基础知识

    端口号常识:  端口号被从1 开始分配.    通常端口号超出255 的部分被本地主机保留为私有用途.    1到255 之间的号码被用于远程应用程序所请求的进程和网络服务.    每个网络通信循环地 ...

  3. 记录java基础的学习过程

    标识符(类名:变量.属性.方法名: ) 组成:类名开头不能是数字,只能有字母数字_$组成. 命名规范: 类名每一个单词首字母大写(HelloWorld大驼峰法则), 方法名 属性名 变量名首字母小写之 ...

  4. java 线程演示

    package unit8; public class Mainthread { public static void main(String[] args) { Thread t = new Thr ...

  5. 常用eclipse 快捷键

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当 ...

  6. Android拓展系列(10)--使用Android Studio阅读整个Android源码

    之前一直在windows下用source insight阅读android源码,效果非常好.后来远程异地服务器,网络限制,一直用ssh + vim,现在主要还是以这种方式.最近发现一个不错的东西(早就 ...

  7. 用js刷题的一些坑

    leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也 ...

  8. ccpc_南阳 C The Battle of chibi dp + 树状数组

    题意:给你一个n个数的序列,要求从中找出含m个数的严格递增子序列,求能找出多少种不同的方案 dp[i][j]表示以第i个数结尾,形成的严格递增子序列长度为j的方案数 那么最终的答案应该就是sigma( ...

  9. wpf,CollectionViewSource,使用数据过滤 筛选 功能。

    class TextListBoxVMpublic : ViewModelBase { public TextListBoxVMpublic() { var list = this.GetEmploy ...

  10. 解决eclipse报PermGen space内存溢出异常的问题

    异常问题如下所示: 1.点击Eclipse->Window->Preferences,如下所示: 2.点击Server->Runtime Environments,选择Apache ...