zoukankan      html  css  js  c++  java
  • XMPP 初探

    最近刚好有机会碰到XMPP,把一些学习心得记录在这边。

    XMPP(Extensible Messageing and Presence Protocol)是一种IM的通讯协定,
    其前身为Jabber,后于IETF标准化为RFC3920。

    除了 ​​一般通讯协定常有的Server与Client外,XMPP还另外定义了Gateway,
    只要通过Gateway,便可以与其他的IM Protocol通话。

    XMPP最大的特色在于传输的内容。其传输的内容为XML;藉由XML的扩充性,
    可以达到许多的扩展应用。不过也由于传输内容为XML,因此无法提供二进制的资料。
    档案传输需藉由外部HTTP。如果不可避免,XMPP协议提供了Base64的方式传输带编码文件。

    XMPP每个用户在网路上都有个独特的Jabber ID,简称为JID。
    JID由id, domain与resource3个部份组成。其格式为:
    id@domain/resource。
    resource有时可以省略。

    传输的内容大致如下:


    |-------------------- |
    | <stream> |
    |---------------------- |
    | <presence> |
    | <show> |
    | </show> |
    |----------------------|
    | <message to="'foo' "> |
    | |
    | </message> |
    |----------------------|
    | <iq to="'bar'"> |
    | <query > |
    | </query> |
    |----------------------|
    | ... |
    |------------ ----------|
    | </iq> |
    |----------------------|


    <stream> </stream>所夹住的部份称为XML Stanza,若是加上<stream> </stream> 
    本身,则称为XML Stream。

    presence有点类似于广播机制,可以针对有特定subscribe的对象传送讯息;
    message里的body是传输的本文,而iq类似于http的request-responce服务。

    底下是RFC里所提供的一个简单的对话session范例

    Client: 
    <stream:stream to="'example.com'" xmlns="'jabber:client'"
    stream="'http://etherx.jabber.org/streams'"
    version="'1.0'">
    Server :
    <stream:stream from="'example.com'" id="'someid'"
    xmlns="'jabber:client'"
    stream="'http://etherx.jabber.org/streams'"
    version=" '1.0'">
    ... encryption, authentication, and resource binding ...
    Client: <message from="'juliet@example.com'"
    to="'romeo@example.net'" lang="'en' ">
    Client: Art thou not Romeo, and a Montague?
    Client: </message>
    Server: <message from="'romeo@example.net'"
    to="'juliet@example.com'" lang="'en '">
    Server: Neither, fair saint, if either thee dislike.
    Server: </message>
    Client: </stream:stream>
    Slient: </stream:stream>

    一开始两方先传送


    Client:
    <stream:stream to="'example.com'" xmlns="'jabber:client'"
    stream="'http://etherx.jabber.org/streams'"
    version="'1.0'">
    Server :
    <stream:stream from="'example.com'" id="'someid'"
    xmlns="'jabber:client'"
    stream="'http://etherx.jabber.org/streams'"
    version=" '1.0'">


    确立了XMPP通讯的开始,而后开始XML Stream的传输,
    在XML Stream传输完了以后结束对话。

    XMPP也支援DNS动态解析出Server IP。

    标准的XMPP client解析的流程为(以example.com为例) 
    解析"_xmpp-client._tcp.example.com" ﹐获得连接的IP和port; 
    如果失败﹐则解析"_jabber._tcp.timyang.net" ﹐这个主要针对老的服务器设定; 
    如果还是失败﹐则客户端认为domain没有配置SRV记录﹐则直接解析"example.com"并使用预设port 5222连接。

    在了解了XMPP的传输内容后,接下来就是XMPP伺服器的架设。

    我们以ejabberd为范例,让大 家了解如何设定ejabberd server。首先安装ejabberd: 

    sudo apt-get install ejabberd

    由于ejabberd使用erlang所撰写而成,因此会相依许多erlang的模组;
    尔后如果需要让ejabberd使用MySQL的资料库,还要上网去抓erlang的相关API。

    http://darkrevival.com/blog/2009/05/22/setup-an-xmpp-server/

    /etc/ejabberd/ejabberd.pem是ejabberd server的凭证。
    如果您有自己的凭证,可以取代之。
    ejabberd的相关设定档主要在/etc/ejabberd/ejabberd.cfg 
    注解为'%'

    其中最重要的有几项:

    设定Admin user:

    {acl, admin, {user, "", ""}}.

    例如:

    {acl, admin, {user, "billy", "localhost"}}.

    如果需要多个admin user,可以添加多列。

    设定Hostname: 
    这边设定的Hostname就代表这个ejabberd自己的名称为何。
    如果设定为example.com,那么billy@example.com 
    就是在这台Server上面认证的。

    {hosts, [""]}.

    例如:

    {hosts, ["localhost"]}.


    如果有新用户注册要提醒谁:

    {registration_watchers, ["@"]}.

    例如:

    {registration_watchers, ["billy@localhost"]}.


    ejabberd预设是使用自己的资料库。
    若是想要改用MySQL作为ejabberd的资料库,
    那么要从mysql,config以及erlang的mysql api三方面下手。

    首先加入erlang的mysql api到ejabberd的module目录底下:

    svn co https://svn.process-one.net/ejabberd-modules/mysql/trunk mysql 
    cd mysql 
    ./build.sh 
    sudo cp ebin/*.beam /usr/lib/ejabberd/ebin


    再来建立ejabberd专用的database:

    wget http://svn.process-one.net/ejabberd/trunk/src/odbc/mysql.sql 
    mysql -u root -p

    在mysql中建立ejabberd专用的帐户

    GRANT ALL ON ejabberd.* TO 'ejabberd'@'localhost' IDENTIFIED by 'password';

    建立ejabberd的资料库

    CREATE DATABASE ejabberd;

    汇入mysql的资料库

    mysql -D ejabberd -p -u ejabberd <>


    等到ejabberd设定好上线后,就可以用ejabberdctl来注册使用者。

    sudo ejabberdctl register billy localhost P@ssw0rd

    之后,就可以连线到

    http://localhost:5280/admin,
    如果ejabberd顺利执行的话,这边可以用admin的id@domain与password登入。

    登入后可以看到各个设定画面。在这边也可以直接注册使用者。

    使用pidgin连线伺服器

    pidgin > 新增帐户

    通讯协定选XMPP,
    使用者填上id,域名填上自己ejabberd server的hostname(或是domain) 
    密码则填上注册的密码,成功的话就可以登入server了。

    Python的XMPP模组有不少,而其中最多人推荐的是PyXMPP 
    PyXMPP的网站上就有不少范例。
    http://pyxmpp.jajcus.net/svn/pyxmpp/trunk/examples/

    其中echo_bot.py与send_message.py是很好用的范例。
    pyxmpp.all.JID可以将JID字串组合成物件,
    pyxmpp.interfaces.stanza可以解析许多传输的内容。
    有兴趣的朋友可以仔细看看。

    以下是使用echo_bot.py的结果。

    Refrence: 
    http://hi.baidu.com/jabber 
    http://darkrevival.com/blog/2009/05/22/setup-an-xmpp-server/ 
    http://zh.wikipedia.org/zh-tw /XMPP 
    http://www.sunbo.name/20080409/xmpp 
    http://xmpp.org/rfcs/rfc3920.html

  • 相关阅读:
    二维图像的DCT变换
    Shell脚本加密--shc/gzexe
    vim python插件--vim python mode
    移动端图片裁剪解决方案
    移动端压缩并ajax上传图片解决方案
    html5拖拽实现
    html5的触摸事件
    js循环添加事件的问题
    h5上传图片
    thinkphp加载第三方类库
  • 原文地址:https://www.cnblogs.com/xuan52rock/p/4607369.html
Copyright © 2011-2022 走看看