文档章节

用smack+openfire做即时通讯

祁达方
 祁达方
发布于 2015/08/19 17:18
字数 655
阅读 1568
收藏 49
点赞 1
评论 0

首发:个人博客

必须说明:smack最新的4.1.1,相对之前版本变化很大,而且资料缺乏,官方文档也不好,所以还是用老版本3.2.2吧。这篇博文中的代码是4.1.1版的,但不推荐用它。
用openfire做服务器,用spark做帮助调试的客户端,用smack(官方文档在这里,感觉写得非常不好)做java的库,来完成即时通讯功能。

1.安装openfire
官网下载安装即可。

2.安装spark
官网下载安装即可。

3.maven引入smack

        <dependency>
                <groupId>org.igniterealtime.smack</groupId>
                <artifactId>smack-java7</artifactId>
                <version>4.1.1</version>
                <exclusions>
                    <exclusion>
                        <groupId>xpp3</groupId>
                        <artifactId>xpp3</artifactId>
                    </exclusion>
                </exclusions>
        </dependency>
        <dependency>
            <groupId>xpp3</groupId>
            <artifactId>xpp3</artifactId>
            <version>1.1.3.4.O</version>
        </dependency>
        <dependency>
                <groupId>org.igniterealtime.smack</groupId>
                <artifactId>smack-tcp</artifactId>
                <version>4.1.1</version>
        </dependency>
        <dependency>
                <groupId>org.igniterealtime.smack</groupId>
                <artifactId>smack-im</artifactId>
                <version>4.1.1</version>
        </dependency>
        <dependency>
                <groupId>org.igniterealtime.smack</groupId>
                <artifactId>smack-extensions</artifactId>
                <version>4.1.1</version>
        </dependency>

如果提示找不到就手动安装一下吧,在maven仓库找到jar并手动下载之后,执行类似下面这条语句:

mvn install:install-file -Dfile={Path/to/your/ojdbc.jar} -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar

4.编写demo代码做实验
关键的概念:配置,连接,花名册,会话管理者,会话

 

import java.util.Collection;

import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.SmackException.NotConnectedException;
import org.jivesoftware.smack.StanzaListener;
import org.jivesoftware.smack.chat.Chat;
import org.jivesoftware.smack.chat.ChatManager;
import org.jivesoftware.smack.chat.ChatManagerListener;
import org.jivesoftware.smack.chat.ChatMessageListener;
import org.jivesoftware.smack.filter.StanzaFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.Stanza;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.roster.RosterListener;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;

public class SmackClient {
    
    public static void countPeople(Roster r){
        System.out.println("在线人数变为:" + r.getEntryCount());
    }
    
    public static void go(){
        try{
            //对连接的配置
            XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
            builder.setUsernameAndPassword("guoguo", "cc19881031");
            builder.setServiceName("127.0.0.1");
            builder.setHost("127.0.0.1");
            builder.setPort(5222);
            //不加这行会报错,因为没有证书
            builder.setSecurityMode(SecurityMode.disabled);
            builder.setDebuggerEnabled(true);
            XMPPTCPConnectionConfiguration config = builder.build();
            
            //建立连接并登陆
            AbstractXMPPConnection c = new XMPPTCPConnection(config);
            
            c.addPacketSendingListener(new StanzaListener(){
                @Override
                public void processPacket(Stanza st)
                        throws NotConnectedException {
                    System.out.println("in StanzaListener:" + st.getFrom());
                }
            }, new StanzaFilter(){
                @Override
                public boolean accept(Stanza st) {
                    System.out.println("in StanzaFilter:" + st.getFrom());
                    return false;
                }
            });
            
            c.connect();
            c.login();
            
            final Roster roster = Roster.getInstanceFor(c);
            Presence p = roster.getPresence("admin@127.0.0.1");
            System.out.println(p.getType());
            roster.addRosterListener(new RosterListener() {
                public void entriesAdded(Collection<String> arg0) {countPeople(roster);}
                public void entriesDeleted(Collection<String> addresses) {countPeople(roster);}
                public void entriesUpdated(Collection<String> addresses) {countPeople(roster);}
                public void presenceChanged(Presence presence) {countPeople(roster);}
            });
            
//            //设置是否在线状态,和状态说明
//            Presence presence = new Presence(Presence.Type.unavailable);
//            presence.setStatus("Gone fishing");
//            c.sendStanza(presence);
            
            //会话管理者的建立和配置监听
            ChatManager chatmanager = ChatManager.getInstanceFor(c);
            chatmanager.addChatListener(new ChatManagerListener() {
                @Override
                public void chatCreated(Chat cc, boolean bb) {
                    //当收到来自对方的消息时触发监听函数
                    cc.addMessageListener(new ChatMessageListener() {
                        @Override
                        public void processMessage(Chat cc, Message mm) {
                            System.out.println(mm.getBody());
                        }
                    });
                }
            });
            
            //建立会话
            Chat chat = chatmanager.createChat("admin@127.0.0.1");
            chat.getThreadID();
            
            //发消息
            Message msg = new Message();
            msg.setBody("hello!");
            chat.sendMessage(msg);
            
            while(true);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        go();
    }
}


© 著作权归作者所有

共有 人打赏支持
祁达方
粉丝 11
博文 41
码字总数 51226
作品 0
大兴
程序员
欢迎进入阿钟的博客导航——快速查找所有博客

世上最遥远的距离,是我在if里你在else里,似乎一直相伴又永远分离;世界上最痴心的等待,是我当case你是switch,或许永远都选不上自己;世界上最真情的相依,是你在try我在catch。无论你发神...

a_zhon ⋅ 2016/08/25 ⋅ 0

AM 快跑了吗

越来越多的公司意识到即时通讯对于整体业务的重要性,但是却没有意识到其实用户需要的是更大的便利。对于多数用户来说,这些即时通讯工具都很重要,就意味着他们必须同时打开QQ、MSN、百度H...

APM项目管理 ⋅ 2013/03/27 ⋅ 0

TeamTalk源码分析(一)—— TeamTalk介绍

TeamTalk是蘑菇街开源的一款企业内部用的即时通讯软件(Enterprise IM),类似腾讯的RTX。网上也有很多的介绍,我这里也有写几遍关于这款产品的“流水账”,一方面对自己这段时间的阅读其代码...

analogous_love ⋅ 2017/05/05 ⋅ 0

Android-IM消息接收事件之EventBus的应用

在即时通讯中需要不断接收服务端的消息。 JMessage提供了Event来匹配本地和服务端的消息接收。 在即时通讯项目中需要大量用到消息接收事件。所以结合项目简单分析下其实现的原理和过程。 事件...

八怪不姓丑 ⋅ 2017/09/11 ⋅ 0

OSC 大咖说 | 专访融云CTO杨攀: 一名全线负责的CTO和他带领的黄金战队

近日,国内著名App驾考宝典和融云达成合作,为应用增加IM功能,实现亿级用户之间聊天。消息一出,IM(即时通讯)领域的大佬,同时也是个上线不到两岁的新生力量,再次引发了行业的关注。 对业...

花仲马 ⋅ 2016/04/22 ⋅ 4

移动端IM开发需要面对的技术问题

1、前言 这两年多一直从事网易云信 iOS 端 IM SDK的开发,期间不断有兄弟部门的同事和合作伙伴过来问各种技术细节,干脆统一介绍下一个IM APP的方方面面,包括技术选型(包括通讯方式,网络连...

JackJiang- ⋅ 2016/08/09 ⋅ 0

类似微信的微会聊应用项目源码

该APP堪比陌陌、微信的即时通讯,功能齐全,运行正常,是一个做即时通讯软件参考的好源码。具体的功能有获取好友,设置头像,发表说说,查看好友说说,相册,上传图片,与好友聊天,发送图片...

tianyahala ⋅ 2016/03/08 ⋅ 0

Android-IM使用Retrofit获取好友在线状态

前段时间用JMessage开发了一款即时通讯软件。 但是有些遗憾的是,sdk并没有提供用户在线状态判断的方法。 只能送其它地方入手,去看了其它文档发现虽然sdk上没有可以直接调用的方法,但是提供...

八怪不姓丑 ⋅ 2017/09/27 ⋅ 0

如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源

1、前言 关于微信内部正在使用的网络层封装库Mars开源的消息,1个多月前就已满天飞(参见《微信Mars:微信内部正在使用的网络层封装库,即将开源》),不过微信团队没有失约,微信Mars 于201...

JackJiang- ⋅ 2016/12/28 ⋅ 1

关于目前自己iOS项目使用的第三方开源库

1.AFNetworking   目前比较推荐的iOS网络请求组件,默认网络请求是异步,通过block回调的方式对返回数据进行处理。 2.FMDB   对sqlite数据库操作进行了封装,demo也比较简单。 3.MBProg...

-Man ⋅ 2015/12/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 19分钟前 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 21分钟前 ⋅ 0

Redux的一些手法记录

Redux Redux的基本概念见另一篇文。 这里记录一下Redux在项目中的实际操作的手法。 actions 首先定义action.js,actions的type,可以另起一个action-type.js文件。 action-type.js用来存...

LinearLaw ⋅ 22分钟前 ⋅ 0

android 手势检测(左右滑动、上下滑动)

GestureDetector类可以让我们快速的处理手势事件,如点击,滑动等。 使用GestureDetector分三步: 1. 定义GestureDetector类 2. 初始化手势类,同时设置手势监听 3. 将touch事件交给gesture...

王先森oO ⋅ 36分钟前 ⋅ 0

java 方法的执行时间监控 设置超时(Future 接口)

java 方法的执行时间监控 设置超时(Future 接口) import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor......

青峰Jun19er ⋅ 40分钟前 ⋅ 0

一名开源小白的Apache成长自述

今天收到了来自Apache Vote我成为Serviceomb项目Committer的邮件,代表自己的贡献得到了充分的肯定;除了感谢团队的给力支持,我更希望将自己的成长经历——如何践行Apache Way的心得介绍给大...

微服务框架 ⋅ 43分钟前 ⋅ 0

vim介绍、颜色显示和移动光标、一般模式下复制、剪切和粘贴

1.vim 是 vi 的升级版 vim 是带有颜色显示的 mini安装的系统,一般都不带有vim [root@aminglinux-128 ~]# yum install -y vim-enhanced已加载插件:fastestmirror, langpacksLoading mir...

oschina130111 ⋅ 43分钟前 ⋅ 0

Deepin 操作系统四面楚歌

作为国内做的最好的 Linux 发行版,源自 Debian sid 的 Deepin 目前正面临重重困境,新版本不断延期,开发人员离职,bug 长期得不到修复,和 Debian/Ubuntu 的兼容性问题也面临越来越严重的挑...

六库科技 ⋅ 43分钟前 ⋅ 0

MyBatis之动态sql

我们需要知道的是,使用mybatis重点是对sql的灵活解析和处理。在原先的UserMappser.xml中,我们这样查询表中满足条件的记录 : 123 <select id="findUserList" parameterType="userQuery...

瑟青豆 ⋅ 44分钟前 ⋅ 0

这届俄罗斯世界杯的冷门那么多怎么办?

最纯粹的世界杯,最神奇的大冷门。 德国0比1被墨西哥摩擦了。 日本历史性的赢了哥伦比亚。 C罗也挑平了西班牙。 梅西被冰岛狮吼吼愣神了。 就连11次进世界杯4强的巴西也被瑞士逼平了。 天台已...

开源中国众包平台 ⋅ 44分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部