最近因为发展需要,要在OA上集成即时通讯工具,本来打算用RTX或MSN的,但是没有相关源码,不好跟具体业务相结合,最后还是放弃了。也想找开源的,但是没找到.NET开发的具有服务端和客户端的,c++和java的倒是有,只可惜自己只对.net比较了解,没办法,只能自己开发了。
在网上找了很多资料,决定实现一个基于XMPP协议的即使通讯工具,包括服务端和客户端。之所以采用XMPP协议,一是因为XMPP是标准的,二是因为有c#
开发的开源的类库可用。
XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。XMPP目前被IETF国际标准组织完成了标准化工作。标准化的核心结果分为两部分;
核心的XML流传输协议 rfc3920
基于XML流传输的即时通讯扩展应用 rfc3921
另外,XMPP Standards Foundation 也定义了许多其他的拓展规范。具体参见XMPP的官方网站:http://xmpp.org/ 这里有所有跟XMPPX相关的RFC
和XMPP拓展协议。上面也列有一些实现了该协议的部分软件,包括服务端和客户端。
英文不好的人还可以查看
http://wiki.jabbercn.org/index.php/é¦é¡µ 这是xmpp的中文网站,翻译了主要的xmpp协议。
目前.net平台上的xmpp开发库主要有:agsxmpp sdk IP*Works Internet Toolkit jabber-net 等。
建议使用agsxmpp 来开发。
xmpp是基于xml来传输数据的。一般采用c/s 模式。客户端通过TCP连接客户端,而且是一直保持连接。目前也有HTTP的实现。
客户端和服务端通过xml流来交换信息。
下面是一段登录所传输的信息:(这是Spark的登录过程)
C 代表客户端 S 代表服务端
C:<stream:stream to="1" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">
S:<stream:stream from='hp520' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='a7747277-ad62-4813-b739-63504d6e1246' version='1.0' xml:lang='zh-cn'>
S:<stream:features xmlns="http://etherx.jabber.org/streams"><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls" /><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><auth xmlns="http://jabber.org/features/iq-auth" /><register xmlns="http://jabber.org/features/iq-register" /></stream:features>
C:<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
S:<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls" />
C:<stream:stream to="hp520" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">
S:<stream:stream from='hp520' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='a7747277-ad62-4813-b739-63504d6e1246' version='1.0' xml:lang='zh-cn'>
<stream:features xmlns="http://etherx.jabber.org/streams"><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><auth xmlns="http://jabber.org/features/iq-auth" /><register xmlns="http://jabber.org/features/iq-register" /></stream:features>
C:<auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">AGh4dwAx</auth>
S:<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl" />
C:<stream:stream to="hp520" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">
S:<stream:stream from='hp520' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='a7747277-ad62-4813-b739-63504d6e1246' version='1.0' xml:lang='zh-cn'>
<stream:features xmlns="http://etherx.jabber.org/streams"><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind" /><session xmlns="urn:ietf:params:xml:ns:xmpp-session" /></stream:features>
C:<iq id="O193v-0" type="set"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>spark</resource></bind></iq>
S:<iq xmlns="jabber:client" id="O193v-0" type="result"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>spark</resource><jid>hxw@hp520/spark</jid></bind></iq>
C:<iq id="O193v-1" type="set"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>
S:<iq xmlns="jabber:client" id="O193v-1" type="result"><session xmlns="urn:ietf:params:xml:ns:xmpp-session" /></iq>