`

smack 源码分析一(android上实现长连接)

 
阅读更多

前段时间应一个项目需求: 要求给终端短信, 联系人信息做一个云存储云备份及云端远程控制终端并且云端能够推送消息到终端的需求. 这需要在终端与云端建立一个长连接以便云端消息能及时推送到终端. 所以项目中用到了smack框架.  smack功能强大, 远不止本文所写的这点内容. 现在我只将对smack的理解以及项目中对smack的使用心得总结并记录下来, 一则给大家分享 , 二则也算是一个技术经验的累积. 但基于我混乱的表达能力和可能的理解上的偏差可能会有些错误. 欢迎各位大虾大牛拍砖. 

项目中用到smack的长连接这块关键有以下这几个类: Connection , XMPPConnection , PakcetWriter , PacketReader. 如下图: 

 

 

查看XMPPConnection源码: 

protected void connectUsingConfiguration(ConnectionConfiguration config) throws XMPPException {
        String host = config.getHost();
        int port = config.getPort();
        try {

            if (this.socket == null || this.socket.isClosed()) {

                LogUtil.i(TAG, "this.socket == null || this.socket.isClosed()");
                if (config.getSocketFactory() == null) {
                    this.socket = new Socket(host, port);
                } else {
                    this.socket = config.getSocketFactory().createSocket(host, port);
                }
            }
 

可以看到, connectUsingConfiguration(ConnectionConfiguration config) 是长连接入口, 传递config制定服务器ipAddress和port , 然后根据config创建一个socket对象. 紧接着调用initConnection()方法, 而在initConnection()中: 

private void initConnection() throws XMPPException {

            usingCompression = false;

        // Set the reader and writer instance variables
        initReaderAndWriter();

        try { 
//            if (isFirstInitialization) {
                packetWriter = new PacketWriter(this);
                packetReader = new PacketReader(this);

                // If debugging is enabled, we should start the thread that will
                // listen for
                // all packets and then log them.
                if (config.isDebuggerEnabled()) {
                    addPacketListener(debugger.getReaderListener(), null);
                    if (debugger.getWriterListener() != null) {
                        addPacketSendingListener(debugger.getWriterListener(), null);
                    }
                }
//            } else {
//                packetWriter.init();
//                packetReader.init();
//            }

            // Start the packet writer. This will open a XMPP stream to the
            // server
            packetWriter.startup();
            // Start the packet reader. The startup() method will block until we
            // get an opening stream packet back from server.
            packetReader.startup();

            // Make note of the fact that we're now connected.
            connected = true;
 

以上执行顺序是

1. initReaderAndWriter()方法通过上面创建的socket实例化connection

的Writer和Reader.

 

2. 实例化PacketWriter和PacketReader对象.

PacketWriter就是向服务器发送数据发送心跳包一直保持与服务器的连接连.  PacketReader则是不断的读取并且解析服务器推送的消息.

 

3. 分别调用packetWriterpacketReader的startup()方法.

至此整个连接过程就建立完成了.

 

 

   长连接大致流程基本就这样, 也许还是一头雾水.  

1.终端如何发生心跳包与服务器一直保持联系的呢.

2.服务器推送消息到终端, 终端是如何根据消息进行分发处理的呢. 

 

请看: smack 源码分析- PacketReader (android上实现长连接) 和

smack 源码分析- PacketWriter (android上实现长连接) 两篇文章. 

 

分享到:
评论

相关推荐

    java android openfire smack项目源码

    同时,源码分析和理解将有助于进一步定制和扩展应用功能,例如添加新的消息类型、实现推送通知、优化性能等。通过这个项目,开发者可以学习到如何集成即时通讯系统到Android应用,以及如何使用Java和Android SDK处理...

    Smack文档中文版

    Smack是一款开源的XMPP(Extensible Messaging and Presence Protocol)客户端库,用于在Java和Android平台上构建实时通信应用。XMPP是一种基于XML的协议,广泛应用于即时消息、在线状态跟踪以及多用户聊天等场景。...

    xmpp Android项目源码打包

    在Android平台上开发XMPP应用,可以利用开源库如Smack或XMPPTCPConnection来实现。本资源提供了三个完整的XMPP Android项目源码,非常适合开发者进行学习和参考。 1. **XMPP基础知识**: - XMPP的核心概念包括JID...

    android IM

    smack 源码分析一(android上实现长连接) http://wangqinghua123.iteye.com/blog/1341355 http://www.push-notification.mobi/get_api_key.php android smack源码分析——接收消息以及如何解析消息: ...

    基于XMPP实现android客户端与服务器的交互(服务器、客户端源码)

    在Android客户端中实现XMPP通信,首先需要集成一个XMPP库,例如Smack或XMPPTCPConnection。开发者需要配置连接参数,如服务器地址、端口、用户名和密码,然后建立到服务器的连接。一旦连接建立,就可以发送和接收...

    Android应用源码基于XMPP的即时聊天项目.rar

    该项目是一个完整的Android即时通讯应用,它利用了XMPP(Extensible Messaging and Presence Protocol)协议来实现...通过深入研究和分析源码,你可以了解如何在Android平台上构建实时通信系统,并掌握相关技术的运用。

    android xmpp 源码

    Android XMPP 源码分析 XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通讯协议,常用于即时消息和在线状态的传递。在Android平台上,开发XMPP客户端可以实现用户之间的文件和文字通信...

    Android应用源码基于XMPP协议的多帐号聊天.zip

    本资料主要探讨了如何在Android平台上构建一个基于XMPP协议的多账号聊天应用,通过源码分析,为开发者提供深入理解与实践参考。 首先,我们需要理解XMPP的基本原理。XMPP是一种基于XML的即时通讯协议,它通过TCP/IP...

    Android应用源码之简洁XMPP.zip

    通过研究这个项目,开发者可以学习到如何在Android上实现即时通讯功能,同时也可以加深对XMPP协议的理解。此外,还能学习到如何将网络库(如Smack)集成到Android项目中,以及如何设计用户友好的聊天界面。对于想要...

    Android 基于XMPP协议IM聊天实现(客户端+服务端) 源码

    在本文中,我们将深入探讨如何使用XMPP协议在Android平台上实现一个完整的即时通讯(IM)系统,包括客户端和服务器端的实现。XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准,广泛用于...

    安卓Android源码——XMPP研究.rar

    五、Android源码分析 深入研究Android源码,我们可以了解如何在系统层面支持XMPP服务。例如,查看Android系统的Accounts服务和Content Providers,了解如何添加、管理XMPP账户。同时,可以研究系统的...

    Android应用源码XMPP研究).zip

    【Android应用源码XMPP研究】是一个针对Android平台上使用Java语言进行应用开发的源码分析项目,主要聚焦于XMPP(Extensible Messaging and Presence Protocol)协议的实现。XMPP是一种基于XML的实时通信协议,广泛...

    安卓Android源码——Xabber客户端.zip

    在源码中,我们可以看到Smack库的使用,它是Java平台上实现XMPP的库,提供连接、认证、会话管理等接口。通过研究Xabber如何利用Smack库进行连接和消息收发,开发者可以更好地理解XMPP的工作流程。 接着,Xabber...

    Android应用源码之基于XMPP的即时聊天项目.rar

    通过分析这个源码,我们可以深入理解如何在Android平台上构建一个功能完善的聊天应用。 首先,源码的核心部分是集成XMPP库,最常见的是Smack。Smack是一个用Java编写的开源XMPP客户端库,能够处理连接、认证、会话...

    见证Android消息推送时刻(源码)

    在Android应用中,通常使用XMPP客户端库(如Smack或XMPPTCPConnection)来建立与XMPP服务器的连接,并进行登录、发送接收消息等操作。 在源码中,你可能会看到以下几个关键部分: 1. **连接管理**:Android应用...

    asmack源码

    ASMack是Android平台上对Smack库的一个优化版本,它专为Android设备设计,以便在移动环境中高效地实现XMPP(Extensible Messaging and Presence Protocol)协议。XMPP是一种开放标准,广泛用于即时通讯和在线状态...

    jitsi 基于 openfire 的 安卓 视频通话 源码

    通过分析"jitsi-android"源码,开发者不仅能学习到如何在Android平台上实现基于XMPP的即时通讯应用,还能深入理解Jitsi和Openfire的集成原理,以及视频通话的关键技术。这对于想要构建自己的音视频通信应用的开发者...

    Android应用源码之AdXmpp(Openfire+asmack+spark) .rar

    通过研究AdXmpp,开发者不仅可以学习到如何在Android平台上实现XMPP通信,还能了解到如何结合服务器端的Openfire和客户端的Asmack,构建一个完整的即时通讯解决方案。这对于想要开发类似功能的应用程序的开发者来说...

    基于XMPP协议的Android即时通信应用项目源码

    在Android上实现XMPP通信,通常会借助于开源库,例如Smack。Smack是一个流行的Java库,支持XMPP协议,并提供了方便的API供开发者使用。它简化了连接、认证、发送和接收消息的过程。在项目"improject源码"中,我们...

Global site tag (gtag.js) - Google Analytics