断断续续翻看了一周Vysper的源码,略有收获吧。之所以说略有,是因为它给我带来的收益没有mina多,mina直接提升了我对java nio、线程池和消息缓冲队列在实际应用方面的认知,并再次发现所有程序中都可见到操作系统所涉及的基本问题和原理,诸如读者写者问题、消息缓冲等等(回头得重新拿起大学时的操作系统教科书看看)。
Vysper源码带给我的收获就是“灵活性”。也许会有人觉得这样很扯,灵活性有什么好说的,但毕竟知易行难,其实“灵活性”三字说的容易,做起来蛮难的。本人写程序时也会努力往“灵活性”这个方向走,但很多时候由于悟性不够高,思考深度不够,最终写出来的程序还是不够灵活,重构又不划算,最终只能尽量微重构了。
正如Vysper在它项目主页中所介绍的“Apache Vysper aims to be a modular, full featured XMPP (Jabber) server.”,模块化是它的最大特性之一,提供了很多接口,如AccountManagement(帐户管理)、OfflineStanzaReceiver(离线消息处理)、RosterManager(通讯录管理)等等,从而非常方便做二次开发,甚至在不需要熟读源码的情况下就可以去整合适用于自己企业的IM了。
下面来说说Vysper的大体运行流程:
1)客户端连接过来,触发XmppIoHandlerAdapter#sessionCreated方法,从而完成和服务器的连接。
2)客户端陆续发送一些消息到服务器端,触发XmppIoHandlerAdapter#messageReceived方法(在该方法内,message已经是Stanza类型了,因为数据经过了XMPPDecoder的处理)。
3)messageReceived方法最终会触发ProtocolWorker#processStanza方法,接着根据stanza类型获取对应的StanzaHandler,尝试处理必要的发送地址改写(发送至其他server的情况)。
4)在StanzaHandler中根据策略可能会尝试TLS握手&SASL握手,之后就正式开始消息的转发、存储等逻辑(主要就是Message,Presence和IQ)。
a) 数据若是发送至其他server,会根据stanza的目标地址连接对方server并发送数据。
b) 数据若是发送至本server内的其他账户,会尝试找出最佳匹配的session再发送数据,当一些类型的数据无法送达时,会根据存储逻辑的设置来决定是否把stanza暂时存起来,方便后面该目标账户连线时可以获取到该stanza。
5)最后,还有XmppIoHandlerAdapter#exceptionCaught处理异常情况,XmppIoHandlerAdapter#sessionClosed处理连接关闭情况。
好了,Vysper的整个运行结构基本清楚了,下一步就该看看XMPP协议了。是的,我都还没看过协议就开始看Vysper源码了,虽然现在最新的是rfc6120,但Vsyper 0.7是基于rfc3920这个已废弃的协议写的,所以我也还是先看看rfc3920好了。(在这里可以推荐一个我近期发现的网站,里面有中文版的XMPP协议,网址是www.jabbercn.org 。)
下一步的目标:了解RFC3920和若干XEP协议,进而开始实现自定义的AccountManagement(帐户管理)、RosterManager(通讯录管理)接口。一个基于企业邮箱通讯录打造的XMPP服务器即将诞生,详见 qiyeliao.com 哦!!!
相关推荐
小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+截图)小程序源码 云笔记 (代码+...
nginx项目源码学习及笔记.zip
狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神SpringBoot笔记+源码 狂神...
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为...基于Django3.2+py3.9的靓号管理系统python源码+学习笔记.zip
本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...
zuul源码学习添加笔记,官方项目代码_ZuulC
微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小程序 云笔记 (源码)微信小...
总之,Spring源码学习是一个深化编程技能,理解设计模式,以及提高问题解决能力的过程。通过深入研究,程序员不仅可以优化自己的代码,还能更高效地利用Spring框架提供的功能,提升项目的可维护性和扩展性。
【Java学习笔记(源码)】是一份详细记录了Java编程语言学习过程的资源集合,包含实际的源代码示例。这份笔记旨在帮助初学者和有一定经验的开发者深入理解和掌握Java语言的核心概念、语法以及常见应用。以下是笔记中...
微信小程序源码 云笔记(学习版)微信小程序源码 云笔记(学习版)微信小程序源码 云笔记(学习版)微信小程序源码 云笔记(学习版)微信小程序源码 云笔记(学习版)微信小程序源码 云笔记(学习版)微信小程序源码 云笔记(学习...
为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序源码,实现云笔记功能需要自己搭建服务器 为知笔记开源项目程序...
STL源码剖析读书笔记 STL(Standard Template Library)的源码剖析读书笔记是对经典著作的总结,涵盖了STL的六大组件、空间分配器、迭代器、仿函式、适配器和容器等知识点。 1. 六大组件 STL提供六大组件,彼此...
学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及Demo源码.zip学习Ruby的笔记以及...
Android最流行的网络请求框架OkHttp的源码的阅读笔记; 详细解读了请求的构建以及执行流程,应用的设计模式以及该设计模式的应用场景等
统计学习方法笔记-基于Python算法实现源码.zip 统计学习方法笔记-基于Python算法实现源码.zip 统计学习方法笔记-基于Python算法实现源码.zip 统计学习方法笔记-基于Python算法实现源码.zip 统计学习方法笔记-基于...
在《Spring Boot》源码学习笔记中,我们可以深入理解其内部工作机制,包括自动配置、起步依赖、命令行接口(CLI)以及如何集成各种组件如JSP等。JSP(JavaServer Pages)是一种用于动态创建网页的技术,Spring Boot ...
《nginx源码学习笔记》.pdf
前端项目源码:模仿有道云,个人制作的一款多人协同的云笔记 前端项目源码:模仿有道云,个人制作的一款多人协同的云笔记 前端项目源码:模仿有道云,个人制作的一款多人协同的云笔记 前端项目源码:模仿有道云,...
学习源码可以让我们了解引用计数和分代回收等策略,以及如何避免常见的内存问题。 3. **标准库**:Python的标准库包含了大量预装模块,如os、sys、math等。深入源码可以揭示这些模块是如何实现特定功能的,比如文件...