`

AndroidPn源码分析(二)

阅读更多

(一)客户端与服务器建立连接

上一篇写到ClientSession createClientSession这里,创建一个客户端的session。在SessionManager类中创建了session之后,这里拼接了两个xml内容的text。一个是Build the start packet response,创建一个头条包,作为回应。另外一个是:XMPP 1.0 needs stream features,是xmpp1.0所需要的文件结构。两个消息的格式内容如下:

<?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="127.0.0.1" 
id
="bdef9c6a" xml:lang="en" version="1.0">
<stream:features>
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"></starttls>
<auth xmlns="http://jabber.org/features/iq-auth"/>
<register xmlns="http://jabber.org/features/iq-register"/>
</stream:features>

然后,调用connection的deliverRawText方法,将这两个xml内容通过IOSession的writer方法,传输到mina里面。具体mina怎么处理,本人还没有研究过。

到此,根据记录的log日志,此消息已经发布了。客户端与服务器建立连接的过程,这里已经完成。这里只是一部分,关于客户端消息的发送,这部分内容也应该不少。

(二)服务器推送消息

从服务器推送消息的时候,会调用NotificationManager类里面的方法,分别为广播和对单个用户发送。这里主要看广播。

首先是构造IQ消息体,createNotificationIQ方法来构造。

复制代码
    /**
     * Creates a new notification IQ and returns it.
     * 构造消息体格式
     */
    private IQ createNotificationIQ(String apiKey, String title,
            String message, String uri) {
        Random random = new Random();
        String id = Integer.toHexString(random.nextInt());
        // String id = String.valueOf(System.currentTimeMillis());

        Element notification = DocumentHelper.createElement(QName.get(
                "notification", NOTIFICATION_NAMESPACE));
        notification.addElement("id").setText(id);
        notification.addElement("apiKey").setText(apiKey);
        notification.addElement("title").setText(title);
        notification.addElement("message").setText(message);
        notification.addElement("uri").setText(uri);

        IQ iq = new IQ();
        iq.setType(IQ.Type.set);
        iq.setChildElement(notification);

        return iq;
    }
复制代码

构造后的xml:

复制代码
<iq type="set" id="860-0" to="159b356f005e4710a1f1c8aa0547e4ce@127.0.0.1/AndroidpnClient">
    <notification xmlns="androidpn:iq:notification">
        <id>11218d6c</id>
        <apiKey>1234567890</apiKey>
        <title>你好</title>
        <message>你好啊</message>
        <uri></uri>
    </notification>
</iq>            
复制代码

在ClientSession中查找指定用户名的session,如果存在,则发送此条IQ消息。调用connectin的deliver方法,通过ioSession.write(buffer),将xml信息传输给mina,并且将发送记录加1。

客户端源码分析:

客户端代码很简单的,依靠xmppmanager维持连接。这里说一下大概流程。

当客户端推送消息过来的时候,NotificationReceiver类的onReceive方法接收到消息,在这里,这时候,已经获得了所有发过来的数据。在这里,已经可以做自己的事情了,因为已经有了需要的数据。不过貌似挺多人喜欢在notifier的notify方法中来进行处理。

其他就是自己的业务了。

还有一个是关于客户端的用户名和密码,这个默认是自动生成,也可以自动指定。在XMPPManager的run方法里面可以修改。修改后会出现一些问题,就是服务器端注册的时候,会出现用户名已经存在,重复插入的问题。这个需要在服务器端插入数据的时候修改一下代码,在UserServiceImpl中修改,为了业务需要,本人把hibernate修改为了mybatis,所以方法略有不同:

复制代码
    public User saveUser(User user) throws UserExistsException {
        try {
            //修改为自己的用户登录
            try {
                user=getUserByUsername(user.getUsername());
                
            } catch (UserNotFoundException e) {
                // TODO Auto-generated catch block
                log.info(user.getUsername()+" is not exist in db ....");
                userDao.saveUser(user);
                e.printStackTrace();
            } 
        } catch (DataIntegrityViolationException e) {
            e.printStackTrace();
            log.warn(e.getMessage());
            throw new UserExistsException("User '" + user.getUsername()
                    + "' already exists!");
        } catch (EntityExistsException e) { // needed for JPA
            e.printStackTrace();
            log.warn(e.getMessage());
            throw new UserExistsException("User '" + user.getUsername()
                    + "' already exists!");
        } 
        return user;
    }
复制代码

这样就可以了。

关于短线重连,网上也有很多解决方法,是客户端加一行代码:

复制代码
 private void addTask(Runnable runnable) { 
         Log.d(LOGTAG, "addTask(runnable)..."); 
         taskTracker.increase(); 
         synchronized (taskList) { 
             if (taskList.isEmpty() && !running) { 
                 running = true; 
                futureTask = taskSubmitter.submit(runnable); 
                if (futureTask == null) { 
                    taskTracker.decrease(); 
                 } 
             } else { 
             //解决服务器端重启后,客户端不能成功连接androidpn服务器 
             runTask(); 
                 taskList.add(runnable); 
             } 
         } 
         Log.d(LOGTAG, "addTask(runnable)... done"); 
    } 


from http://www.cnblogs.com/juepei/p/3904357.html
分享到:
评论

相关推荐

    androidPN源码eclipse tomcat版本

    以上就是关于"androidPN源码eclipse tomcat版本"的主要知识点。了解并掌握这些内容,你就能有效地实现一个简单的推送通知服务。在实际开发过程中,可能还需要考虑安全性、性能优化以及兼容性等问题。

    AndroidPN源码

    **四、AndroidPN源码分析** AndroidPN的源码可以帮助开发者理解如何实现一个完整的推送服务。通过阅读`PushService`、`PushReceiver`、`PushServerSync`等相关类,可以学习到如何创建后台服务、如何处理广播接收器...

    Androidpn源码

    源码分析可以揭示如何实现高效、可靠的消息队列。 3. **推送服务**:服务器端有一个后台服务,定时检查消息队列并尝试发送消息。这部分可能涉及到多线程和异步处理,确保消息能够及时、准确地发送到目标设备。 4. ...

    androidpn服务端项目源码已修改

    总的来说,这个修改过的AndroidPN服务端项目源码为开发者提供了一次学习和实践推送通知服务的机会,通过分析和理解代码,可以提升Android应用的实时通信能力和后台服务的构建技能。同时,对于想要自建推送服务的...

    androidpn 消息推送 服务器端源码

    在实际应用中,开发者可以根据自身需求,对AndroidPN服务器端源码进行定制,比如增加消息分类、统计分析功能,或者对接其他后台系统。通过对源码的深入学习和实践,开发者不仅可以掌握Android消息推送的核心技术,还...

    Android推送框架 androidpn

    Androidpn推送框架源码分析及配置方法,压缩包里面包括服务端和客户端代码,及说明文档

    androidpn消息推送源码

    7. **学习和实践**:分析和研究AndroidPN的源码,可以帮助开发者深入理解XMPP协议的工作原理,以及在Android平台上实现消息推送服务的具体步骤。通过修改和扩展源码,可以定制自己的推送服务,满足特定的应用场景...

    about androidPN

    【AndroidPN】是一个开源的Android推送通知服务,它基于XMPP协议,由Java编写,提供了一种可扩展的方案,让服务器能够向Android客户端...开发者可以通过理解和定制AndroidPN源码,根据自身需求构建更个性化的推送服务。

    androidpn

    由于描述中没有给出详细信息,我们将根据标签和可能的源码分析来探讨相关知识点。 1. **Android 应用程序架构**: 在Android平台上,开发者通常使用Activity、Service、BroadcastReceiver和ContentProvider这四大...

    androidpn-client 0.5 推送

    **三、源码分析** 在"androidpn-client-0.5.01111"源码包中,我们可以找到以下几个关键模块: 1. **MainActivity**:主活动类,启动客户端并处理用户交互。 2. **PushManager**:推送管理器,负责客户端的注册、...

    androidpn-client

    在"androidpn-client"的源码中,我们可以学习到如何在Android应用中实现上述功能,包括使用Socket编程、线程管理、JSON解析、Android服务和广播接收器等技术。此外,对于希望深入理解Android推送通知机制或者想要...

    anroid完美实现 push推送 源码奉送

    3. **源码分析**: - `androidpn-client-0.5.0.zip` 包含了AndroidPN的客户端源码,开发者可以深入研究其中的网络连接、消息解析和推送处理等逻辑。 - `androidpn-server-0.5.0-src.zip` 提供了服务端的源代码,有...

    MyPushManager源码

    通过分析MyPushManager的源码,我们可以学习到如何在Android环境中建立稳定的长连接,如何解析和处理JSON数据,以及如何设计服务以适应不同网络环境和用户需求。这对于我们开发自己的消息推送系统或优化现有推送服务...

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

    4. **源码结构分析**: "本源码使用帮助.txt"可能包含项目的基本用法、注意事项和配置步骤。"androidpn-client"应该是Android客户端的源代码,包括必要的XML配置文件、Activity、Service、BroadcastReceiver等组件...

    android IM

    android smack源码分析——接收消息以及如何解析消息: http://www.cnblogs.com/not-code/archive/2011/08/01/2124340.html MTQQ http://www.cnblogs.com/charley_yang/archive/2011/03/27/1997938.html ...

    android客户端分析

    **二、源码分析** 1. **初始化与服务启动** 在程序的入口类`DemoAppActivity`中,首先创建了一个`ServiceManager`实例,然后调用`setNotificationIcon()`设置通知图标,并通过`startService()`启动消息接收服务。`...

    asmack源码(asmack-android-18-source-0.8.9)

    综上所述,asmack-android-18-source-0.8.9源码包为开发者提供了深入了解和定制XMPP通信功能的机会,通过阅读和分析源码,开发者可以更好地理解和优化其在Android应用中的使用。同时,这个版本的源码也反映了特定...

    andoidpn官网服务器、客户端全部数据

    这里提到的“andoidpn官网服务器、客户端全部数据”,包含的应该是AndroidPN项目的服务器端代码、客户端应用源码以及可能的配置文件、数据库脚本等,还有提供的一个apk文件,可能是编译后的AndroidPN客户端应用。...

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

    描述中的“源码”提示我们,这个压缩包可能包含了实现这一功能的服务器和客户端的源代码,这对于开发者来说是宝贵的资源,可以直接学习和修改以适应自己的项目需求。 标签“android xmpp”进一步确认了我们讨论的...

    android电子商城

    这个项目包含了服务端和客户端的源码,以及相关的开发文档,为开发者提供了全面了解和二次开发的基础。 首先,从【描述】中我们可以看出,这个项目包括了以下几个关键部分: 1. **红孩子电子商城服务端源码**:这...

Global site tag (gtag.js) - Google Analytics