Jade Dungeon

硕士专业学位论文开题报告

姓 名 单琪玮
学 号 63111200029
导师姓名、职称 俞黎阳
系 所 计算机系
专 业 方 向 计算机技术
入 学 时 间 2011年2月
   
论 文 题 目 《XMPP协议的研究及基于Scala语言的实现》

一、立论依据

一、研究的目的和意义

进入Web 2.0时代以后,由于用户直接参与网络内容的生产,许多网络应用迅速进入了海量 数据的时代。面对着大数据、高并发场景的新挑战,函数式语言因为其先天的无副作用特性 与灵活的语法,渐渐取代了面向对象语言,受到了业界的广泛使用。

Scala语言作为一门面向函数式的语言,同时支持面向对象的编程方式,方便初次接触 函数式语言的程序员实现平滑过渡。而且Scala底层由Java实现,可以使用大量现有的Java 库,避免「重复发明轮子」以提高开发效率。更因为有着JVM虚拟机这个优秀的运行环境与 JIT即时编译的强大性能优化,在众多函数式语言中有着独特的优势。

当今网络发展迅速,越来越深入到人们生活中的方方面面,各种丰富的网络应用层出不穷 。这些应用在方便人们生活的同时,为了留住自己的用户群都选择使用各自封闭的应用层 协议来实现自己的功能。比如国内市场占有率最高的即时通讯软件QQ,它的服务与应用程序 QQ客户端是绑定的。用户只能使用腾讯公司官方的程序QQ客户端,而且QQ通讯协议也是 不开放的。任何逆向解析QQ协议与自行开发QQ客端的行为都被定义为侵权行为。

虽然使用自己定义的协议是各公司自由与权力,但这与互联网自由开发的精神相违背。 大公司为了自身的利益选择封闭协议,但是广大的互联网爱好者与初创公司,为了不同的 应用之间可以相互通信、为了用户可以方便地对不同服务选择自己习惯的应用程序、为了 有能力的程序员可以对应用进行深度地定制,一个通用的、开放的、具有强大可扩展能力的 应用层通信协议是非常有必要的。而XMPP协议正好就具有这些优点。

二、国内外研究现状分析

1、 国外发展现状

除了客户端与服务器之间的通讯功能,XMPP还支持服务器与服务器之间的通信。这样就 形成了一个去中心化的服务器群,不同公司、不同网络之间的服务器可以通过XMPP协议 连接在一起,目前国外的Jabber、ICQ、Google Talk、Yahoo Message、MSN Messenger都 已经通过XMPP协议连接,这样一个Jabber用户就可以直接与MSN Messenger通信,而不是 需要同时打开Jabber与MSN Messenger两个客户端。

国外比较著名的XMPP库:

  1. Smack:基于Java实现。在实现协议的同时,将复杂的XMPP协议封装为了几个常用的 API接口以方便重用,在国外非常受欢迎。在实现方式通过了SAX解析XML文本,并结合 Java语言内置的线程控制方式实现多线程异步通讯。
  2. Gloox:Gloox是一个基于C++实现的XMPP协议客户端开源类库,它实现了XMPP协议核心 XML传输机制以及基于XML流的一些扩展应用,通过Gloox可以很容易的与XMPP服务器进行 即时通讯,发送接受XMPP消息。
  3. AnyQ:AnyQ这款产品是按照国际标准XMPP协议开发的一套即时通讯系统。使用VC++开发。
  4. Converse.js是一个开源的web聊天客户端,运行于浏览器中,因此能够集成到任何网站。 能连接任何支持XMPP/Jabber的服务端,不管是类似Jabber.org这样的公共聊天服务端, 还是私有的服务器。

Scala语言在国外受到了广泛地使用,如:LinkedIn、EDFT、Twitter、Novell、the Guardian、Xebia、Xerox、FourSquare、Sony、Siemens、Thatcham、OPower、GridGain, AppJet、Reaktor。著名的社交网站twitter在创业初始使用Ruby实现快速开发与更新。但 由于Ruby性能瓶颈的限制,twitter经常由于服务器承受不住激增流量而频频崩溃。2012年 ,twitter把核心服务由Ruby转移到Scala后,服务器的吞吐量有了极大地提高。

XMPP一开始就是作为即时消息通信协议(IM协议)而定制的,但由于协议的文本本身是以 XML元素的形式展现,所以在XML的强大语义支持下,XMPP也同时具有了强大的语义与 高度的可扩展性。XMPP不仅可以作为即时消息通讯协议,还被用于实现带有连接状态的 Web Service实现。

2、国内发展现状

Scala语言在国内互联网公司使用的不多,如:阿里巴巴,还有一些投资银行。某投行上海 研发部核心业务用的是Java,然后用Scala一些DSL(Domain-Specific Language领域定制 语言)定制接口给客户使用。因为有些不是程序员出身的员工也要定制一些业务流程。而 Scala对DSL的良好支持可以实现这一点。

国内XMPP的主要使用群体是程序员与其他互联网相关技术人员,大公司为了封闭生态圈, 使用XMPP协议的比较少见。但这一情况已经在渐渐改变,比如人人网、如意通等国内企业 也已经开始使用XMPP协议,相信以今后XMPP在中国一定会有更广阔地发展前景。

三、主要参考文献

  1. Cay S.Horstmann,快学Scala[M],电子工业出版社,2012
  2. V Subramaniam,Scala程序设计:Java虚拟器多核编程实战[M],人民邮件出版社,2010
  3. Scott Chacon. Pro Git[M]. APress,2009.
  4. V Goetz. Java并发编程实战[M]. 机械工业出版社,2011.
  5. V Subramaniam. Java虚拟机并发编程[M]. 机械工业出版社. 2013.
  6. 周志明. 深入理解Java虚拟机:JVM高级特性与最佳实践 [M]. 机械工业出版社,2011.
  7. E R Harold. Java网络编程 [M]. 中国电力出版社,2006.
  8. K L Calvert, M J Donahoo. TCP/IP Sockets in Java, Second Edition: Practical Guide for Programmers[M]. Morgan Kaufmann,2008.
  9. R C Martin. 敏捷软件开发:原则模式与实践 [M]. 清华大学出版社,2003.
  10. K Beck.测试驱动开发:实战与模式解析 [M]. 机械工业出版社,2013.
  11. M Fowler. 重构:改善既有代码的设计 [M]. 人民邮电出版社,2010.
  12. 许晓斌. Maven实战 [M]. 机械工业出版社,2011.
  13. 蒋鑫. Git权威指南 [M]. 机械工业出版社,2011.

二、研究方案

一、研究目标、研究内容和拟解决的关键问题

1、 研究目标和内容

  1. 函数式编程在生产环境中的可行性,以及使用范围。
  2. XMPP协议的基本实现,以及可能的应用范围。

2、拟解决的关键问题

  1. 是否有必要使用函数式编程,如何替代传统的设计模式。
  2. 如果基于Scala本身的语言特性实现面向切面(AOP)编程。
  3. 如何基于Scala本身的语言特性实现依赖注入(IOC)。
  4. XMPP协议的基本规范。
  5. XMPP连接建立的验证过程。
  6. XMPP基本的文本传输实现。

二、拟采取的研究方法、技术路线、实验方案及可行性分析

在编程语言上我选择了同样基于JVM的Scala。原因有三:

  1. Scala支持函数式编程风格更加优雅,内置Actor模式实现,且更加适合并发并行处理。
  2. Scala作为同为JVM的语言可以直接调用Java类与方法,可以使用现在的Java类库。避免 重复制造轮子的工作。
  3. Scala同时支持面向对象与函数式编程,可以在二者之间灵活折衷地运用。并不像是Lisp 或是Haskell那些纯函数式语言一样强制只能用函数式风格。

单元测试、版本控制与其他:

  1. 单元测试使用scala-test
  2. 版本控制工具为git,代码可以直接托管在github上方便版本管理、历史追溯、沟通协作 。
  3. 构建工具为了与Java兼容使用Maven。

三、本论文的特色与创新之处

由于本项目使用了基于函数式的语言,这在国内是一个比较少见的选择。虽然函数式语言 在表达方式上显得更加优雅,由于函数范式的理论基础λ演算(lambda calculus)与目前 广泛使用的图灵机是两个相互独立的系统,过去人们认为在以图灵机为基础的指令式 硬件上翻译函数式逻辑会有一些翻译上的性能消耗。但是随着硬件工艺的发展遇到了 理论上的瓶颈,摩尔定律面临的失灵情况。在过去20多年中计算机性能提升依赖硬件提升的 「免费午餐」已经消失,人们不得不在并行计算方向寻找提升。此时,函数式语言天生的 无副作用与不可变值特性可以让大量的处理任务并行执行,以应对如今大数据时代的挑战。

四、预期的论文进展和成果

  • 6月1日之前:学习有关资料并完成开题报告
  • 6月2日 到 7月14日:系统需求分析,系统分析阶段
  • 7月15日 到 8月19日:系统界面设计,编码实现阶段
  • 8月20日 到 8月30日:系统功能整合,系统调试阶段
  • 9月1日 到 10月15日:撰写毕业论文
  • 10月16日 到 10月23日:准备答辩阶段

三、论文大纲

  • 一、 前言
    • 1.1 选题背景
    • 1.2 主要目标
    • 1.3 国内外研究现状
    • 1.4 全文结构
  • 二、XMPP协议基础
    • 2.1 JID
    • 2.2 STANZAS
      • 2.2.1 常见属性
      • 2.2.2 常见片段
    • 2.3 连接生命周期
      • 2.3.1 建立连接
      • 2.3.2 建立流
      • 2.3.3 验证
      • 2.3.4 断开连接
  • 三、登录过程详解
    • 3.1 基本协议
      • 3.1.1 TLS
      • 3.1.2 SASL
    • 3.2 XMPP使用tls和sasl登录
    • 3.3 取得联系人列表
  • 四、开发环境的构建
    • 4.1 Scala语言的安装与配置
    • 4.2 Maven构建工具
      • 4.2.1 配置构建Scala程序
      • 4.2.2 配置ScalaTest测试
      • 4.2.3 混合编译Scala与Java
  • 五、应用基础架构
    • 5.1 连接配置模块
      • 5.1.1 连接信息配置:ConnectionConfig
        • 5.1.1.2 Scala的构造器与成员
        • 5.1.1.3 日志工具slf4j
      • 5.1.2 连接类抽象:Connection
      • 5.1.3 解析服务器地址
      • 5.1.4 建立Socket连接
    • 5.2 读写工具模块
      • 5.2.1 Scala对XML字面量的支持
      • 5.2.2 用有限状态机判断XML读取完整
      • 5.2.3 实现读取器辅助读取服务器消息
      • 5.2.4 通过Actor模式实现多线程
      • 5.2.5 实现异步的读写工具
    • 5.3 验证模块
      • 5.3.1 Base64算法
        • 5.3.1.1 Scala程序调用现成的Java代码
        • 5.3.1.2 调用现成Base64算法的Java实现
      • 5.3.2 认证信息
        • 5.3.2.1 认证管理器
      • 5.3.3 用户认证与SASL认证
      • 5.3.4 认证机制
      • 5.3.4.1 各种SASL认证实现
  • 六、实现登录功能
    • 6.1 与服务器建立Stream连接
    • 6.2 建立SASL认证
    • 6.3 绑定会话与连接
  • 七、联系人与状态
    • 7.1 JID类的实现
    • 7.2 Scala的模式匹配与样本类
    • 7.3 解析服务器发送的联系人列表
    • 7.4 解析服务器发送的联系人状态
  • 八、消息的发送与接收
    • 8.1 消息类的抽象
    • 8.2 以类HTML格式定义格式化消息
    • 8.3 接收消息
    • 8.4 发送消息
  • 九、总结与展望

四、研究基础

1.已参加过的有关研究工作和已取得的研究工作成绩

已经有的研究工作:

  1. 有大量并发环境下系统开发的经验,了解JVM虚拟机的并发模型、内存模型、GC回收机制 。
  2. 熟悉Linux系统的基本操作,能够在不依赖IDE集成开发环境的情况下用基础工具链组成 开发环境。
  3. 熟悉Sql语言与MySQL数据库的配置。了解基础的HTML+CSS+Javascript,能在前端设计 人员的工作结果上继续开发。

工作成绩:

  1. 在工作期间以Java作为主要开发语言。参加过账务管理系统、比价网站、电商网站的 开发工作。
  2. 在服务器上搭建基于Nginx的个人技术博客。

2. 已具备的实验条件,尚缺少的实验条件和拟解决的途径

已经具备了开发环境:

  1. 操作系统使用Debian Linux。
  2. JDK1.7开发库、构建工具使用Maven、文本编辑器Vim。
  3. 版本控制系统选择Git,服务商为GitHub。

缺少的实现条件:

  • 没有构建XMPP服务嚣环境,暂时先使用免费的XMPP服务提供商Jabber。