• XMPP学习笔记一


       最近因为发展需要,要在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>

  • 相关阅读:
    jquery类似方法的比较(二)
    获取数组中最大值的方法(最小值同理)
    jquery类似方法的比较(一)
    余老板
    N小时改变一次url时间戳的方法
    元素的前后关系
    损失函数, 成本函数, 目标函数的区别
    Ternsorflow 学习:005-MNIST入门 实现模型
    arm linux 移植支持 HP打印机
    在Anaconda3环境下安装并切换 Tensorflow 2.0 环境
  • 原文地址:https://www.cnblogs.com/hxw/p/xmpp.html
Copyright © 2020-2023  润新知