您的位置:首页 > 移动开发 > Android开发

xmpp/aSmack源码分析(基于android客户端)

2015-12-15 17:34 232 查看
首先aSmack.jar包源码的分析:org.apache.harmony.javax.security包auth包:callback包:类Callback 抽象接口 未提供方法,实现类有:CallbackHandler抽象接口 handle(Callback[] paramArrayOfCallback)方法ChoiceCallback可序列化,提供get/set方法,获取/设置选择单项或集合,以及选中的下标,是否允许多选,默认选择下标;ConfirmationCallback、LanguageCallback、NameCallback、PasswordCallback、TextInputCallback、TextOutputCallback可序列化UnsupportedCallbackException未实现Callback接口调用异常;login包:主要为登录安全异常处理,直接或间接继承GeneralSecurityException分为账号异常、证书异常、登录失败异常,其中账号异常有子类(账号过期异常、账号上锁、账号无法找到异常);证书异常分子类(证书过期异常、证书无法找到异常);AppConfigurationEntry配置入口:LoginModuleControlFlag登录控制标记(分请求的、必备的、可选的、充分的,)、登录模块的名字、选项字典;Configuration抽象类主要检查get/set配置的权限;org.jivesoftware.smack包:filter过滤包:PacketFilter抽象接口,public abstract boolean accept(Packet paramPacket);对接收的包进行需要的处理AndFilter实现类封装了过滤接口的集合,在此类中根据处理状态进行循环处理;NotFilter非过滤的处理;OrFilter只要满足一个接受就表示处理了的过滤;FromContainsFilter实现类对包发送方与构造传参的发送方进行匹配过滤,查询是否为该发送方;ToContainsFilter实现类对包接收方进行匹配过滤;FromMatchesFilter实现类对发送方的地址进行过滤,防止外部调用;IQTypeFilter任务类型过滤;MessageTypeFilter消息类型过滤;PacketExtensionFilter命名空间/元素名的过滤;PacketIDFilter包ID的过滤;PacketTypeFilter包类型过滤;必须是Packet类型;也可以说是安全考虑;ThreadFilter线程过滤,必须是Message类型,并且同一线程才表示处理;isAssignableFrom()调用者是否为参数的父类;packet消息封装包:PacketExtension抽象接口,提供方法public abstract String getElementName();获取元素名public abstract String getNamespace();获取命名空间public abstract String toXML();包转为xml格式的字符串;实现类DefaultPacketExtension通过构造函数 设置默认的原始名和命名空间,可添加key-value附加消息;Packet抽象类,封装了发送/接收方及包id基本信息,附加属性信息;方法public abstract String getChildElementXML();用于上传消息时的封装;抽象子类IQ主要任务是将Packet对象转为xml字符串,设置任务类型(get/set)==》实现类Authentication(封装了认证信息用户名、密码等),Bind表示绑定资源类消息,Session表示会话消息,Privacy隐秘消息,Registration表示注册的消息,RosterPacket封装了好友列表;实现类Message封装了具体消息(包括主题、消息体、消息基本信息、消息类型即(正常、单聊、群聊、头条推送、错误));Presence实现类封装了消息的一些状态(包括可用、不可用、赞成、已经赞成、取消、错误等类型,会话、可见、离开、下线、上线模式);provider包:IQProvider抽象接口,提供方法public abstract IQ parseIQ(XmlPullParser paramXmlPullParser)throws Exception;客户端进行pull解析封装为IQ;实现类PrivacyProvider;PacketExtensionProvider抽象接口,方法public abstract PacketExtension parseExtension(XmlPullParser paramXmlPullParser)throwsException;进行pull解析封装为PacketExtension;ProviderManager类管理IQProvider和PacketExtensionProvider;proxy包:DirectSocketFactory类根据主机,端口创建socket套接字;ProxyInfo类封装了主机,端口,用户名,密码,代理类型(none/http/socks4/socks5),可根据类型获取代理socket工厂;
HTTP代理:能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80、8080、3128等;
SOCKS代理SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心是何种应用协议,既可以是HTTP请求,所以SOCKS代理服务器比其他类型的代理服务器速度要快得多。SOCKS代理又分为SOCKS4和SOCKS5,二者不同的是SOCKS4代理只支持TCP协议(即传输控制协议),而SOCKS5代理则既支持TCP协议又支持UDP协议(即用户数据包协议),还支持各种身份验证机制、服务器端域名解析等。SOCK4能做到的SOCKS5都可得到,但SOCKS5能够做到的SOCK4则不一定能做到,比如我们常用的聊天工具QQ在使用代理时就要求用SOCKS5代理,因为它需要使用UDP协议来传输数据;
HTTPProxySocketFactory类直接套接字http传输;
Socks4ProxySocketFactory类,Socks5ProxySocketFactory类;
util包;
ConnectionConfiguration连接配置,主要封装主机ip,端口等信息服务于XMPPConnection;
PacketCollector类主要有一个阻塞队列private LinkedBlockingQueue<Packet> resultQueue;对尾部和首部的进行操作;
LinkedBlockingQueue知识点:
LinkedBlockingQueue是一个基于已链接节点的、范围任意的blocking queue的实现。此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。可选的容量范围构造方法参数作为防止队列过度扩展的一种方法。如果未指定容量,则它等于 Integer.MAX_VALUE。除非插入节点会使队列超出容量,否则每次插入后会动态地创建链接节点。1:如果未指定容量,默认容量为Integer.MAX_VALUE ,容量范围可以在构造方法参数中指定作为防止队列过度扩展。2:此对象是 线程阻塞-安全的   3:不接受 null 元素4:它实现了BlockingQueue接口。
    5:实现了 Collection 和 Iterator 接口的所有可选 方法。 bq.offer("ix",5,TimeUnit.SECONDS);//在尾部插入一个元素,如果有必要    ,等待 指定的时间,使得队列变得可用。返回boolean值  表示是否插入成功。        bq.put("ixx");//将指定的元素添加到队列的尾部,如有必要,则等待空间变得可用,如果空间满了,则会一直等到空间可用时,进行插入。   bq.poll();//
poll()
//
poll(long timeout, TimeUnit unit)
检索并移除此队列的头,如果此队列为空,则返回 null。   bq.
clear()
从队列彻底移除所有元素。 bq.
peek()
检索,但是不移除此队列的头,如果此队列为空,则返回 null。
PacketListener抽象接口,方法public abstract void processPacket(Packet paramPacket);此方法在对包进行了过滤后才执行,对接收的包进行处理;
ConnectionCreationListener抽象接口,方法public abstract void connectionCreated(Connection paramConnection);
PacketInterceptor抽象接口,方法public abstract void interceptPacket(Packet paramPacket);对包进行拦截;
ConnectionListener抽象接口,
public abstract void connectionClosed();public abstract void connectionClosedOnError(Exception paramException);public abstract void reconnectingIn(int paramInt);public abstract void reconnectionSuccessful();public abstract void reconnectionFailed(Exception paramException);
Connection抽象类:封装了账号管理和会话管理类
内部类ListenerWrapper封装了包监听和包过滤,内部处理方法操作包;
内部类InterceptorWrapper封装拦截器和过滤器,对于某些包在处理后需要进一步操作的调用;
    实现类XMPPConnection,内部主要方法,
连接connect()完成socket连接;
addPacketListener(PacketListener packetListener, PacketFilter packetFilter)添加包监听和包过滤监听器;
sendPacket(Packet paramPacket);发送包,父类的抽象方法;
login(String username, String password, String resource)登录;参数3可理解为登录平台;MessageListener抽象接口,方法public abstract void processMessage(Chat paramChat, Message paramMessage);对接收的消息进行处理;另可参考 http://www.cnblogs.com/not-code/archive/2011/08/01/2124340.html http://www.cnblogs.com/eustoma/p/4216940.html http://blog.csdn.net/sun_zhicheng/article/details/26704247
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: