XMPP核心协议客户端

XMPP就是Jabber协议的正式名称。其核心协议就是一个通过socket等媒介发送XML的规范。非常简单,好实现。
先是通过socket建立一个网络连接
然后客户端向服务器发送一个<stream:stream....>这样的XML开始标签
然后服务器会返回一个<stream:stream...>这样的标签,作为握手信号
然后这就标志着双方可以开始XML流的互通了
断开似乎不需要发送</stream:stream>,但也不一定,需要再详细阅读一下协议。目前是直接断开socket连接,并没有多大问题。
中间的XML流的互通的形式是<iq id='abc'>...</iq>这样的一个XML节(XML Stanza)的发送过去然后服务器用<iq id='abc'>...</iq>这样的XML节来回应。目前核心协议规定的XML节有三个presence, iq, message。
综观整体的协议沟通的过程,就是把一个完整的XML文件一段一段的发送过去,<stream>是根节点,然后每次发送的是根节点下的那些次根节点。

所以目前用Delphi实现需要三个类:
TXMPPClient(继承自TIdTCPCustom)
TXMPPListenerThread(继承自TIdThread,因为这个Thread比VCL那个要好用一些。需要专门的侦听线程是因为XMPP没有像HTTP那样有明确的一问一答的应答形式。像message这种XML Stanza可能在任何时候到达。所以需要一个专门的侦听线程不断的从系统的Socket Stack中把东西读出来)
TXMPPProtocol(这个用来实现基于核心协议之上的那些表达即时通讯逻辑的网络通讯逻辑,比如发送消息啊,上线啊这些。作为TXMPPClient的事件的接收者)

目前实现的核心在TXMPPClient上,需要四个基本的功能,Connect(连接上之后自动发送<stream开始标签,并且能判断是否握手成功),Send Stanza(发送一个XML节),Stanza Received(当收到一个XML节的时候调用所有注册的回调函数),Disconnect(断开连接,干净安全)。即便就这简单的四个功能也需要Client和侦听线程的同步与配合,并不是太简单无味的事情。等明天晚上具体把这些都实现了就可以开始着手吧上层协议一项项做出来了。
原文地址:https://www.cnblogs.com/taowen/p/92734.html