第一章XMPP协议现状与问题1.1前言大概两年前笔者开个了大坑,写下《一步一步从原理跟我学邮件收取及发送》一文。虽然至今没有完结,不过主要的内容其实也说得差不多了J。好吧,最主要的原因是笔者后面开发newbt.net的即时通信功能,花的时间比较多(当然还有些别的不便说明的私人状况)。在开发即时通信系统的过程中,笔者发现即时通讯的开发问题比电子邮件中的还要严重!即时通讯中的兼容性问题比电子邮件严重得多,以最知名的即时通讯协议xmpp来说都已经走了很多的弯路,根本就不实用!因此我们这系列文章就是要告诉大家如何开发一个实用的即时通讯系统,而xmpp协议只是其中的一个组成部分,我们要展示它如何与其他协议和知识相结合组成一个真正可用的系统。最初开发这个xmpp项目的目的是为了给newbt免费邮箱加上来信通知。说到通知,大多数开发者第一时间一定会想到使用手机短信来实现,但这在现实中并不可行。以一个实际项目为例:几年前我给人外包做一个商城系统,没想到还真有不少用户购买商品。这就带来了一个非常大的问题,怎样及时通知我这位客户去赶紧给人发货呢?一开始我们使用的是现在最流行的手机短信,效果没得说,阿里云的就很好用。但是客户不干了,说是费用太高,说实在的我一点没觉得高,一笔订单一个几分钱的短信吗,所以说我们这些程序员都做不成老板……但在老板的角度这就是太贵了!所以使用即时通信这时候就是必须的。而即时通信的众多协议中目前最流行的就是xmpp了。说到xmpp协议,首先要介绍一下它目前的应用情况。说实在的,非常的不乐观,曾经兼容它的googlegtalk/gmail、网易泡泡等这些软件几乎全部抛弃了xmpp协议。这当中的原因很多,不过xmpp协议越来越臃肿、越来越不实用应该是最大的原因。笔者在开发newbt的即时通信之前早就接触过xmpp协议,实际的项目中还曾经在两家公司中做过以xmpp为基础的即时通讯系统,所以也还算有点发言权。总的来说xmpp整个生态其实并不实用,要将其实用化应该进行适当的取舍、裁剪。只要先行抛却贪大求全的思想,xmpp协议还是可以加以利用的。1.2xmpp协议及当前实现的缺点xmpp协议的优点想必大家已经知道得很多了:基于xml格式、通用、资源较多等等,所以我们重点说一说它的缺点。首先一点,就是不兼容。以发送一张图片为例,各个客户端的实现方法那是各显神通各有各的办法:有用base64内嵌的,有用独立数据包格式的,还有直接用utf8表情符号的……根本就不是一回事。这直接让标榜开放的xmpp变成了事实上不开放的协议(这很像现在的电子邮件,各厂商自成一派很难正常把邮件发送过去)。第二点,贪大求全,太过复杂。以xmpp的好友协议为例,它试图将即时通讯中的好友操作规范化,并实现为了数个协议部分,但这根本就不实际。在现实的即时通信系统中,好友操作的复杂度和需求变化远远超过xmpp协议中的内容,这直接使得很多以xmpp为基础的系统其实并不使用它的好友相关的协议(其实在xmpp中这通常称之为订阅,和我们常见的QQ/