Chinaunix首页 | 论坛 | 博客
  • 博客访问: 643156
  • 博文数量: 151
  • 博客积分: 3498
  • 博客等级: 中校
  • 技术积分: 1570
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-28 18:10
文章分类

全部博文(151)

文章存档

2014年(12)

2013年(17)

2012年(17)

2011年(5)

2010年(12)

2009年(2)

2007年(26)

2006年(22)

2005年(38)

分类: WINDOWS

2007-08-09 13:59:49

本来是准备做一个项目的,项目要求用JABBER实现IM的功能,所以就开始研究这个协议了。这个协议其实就是一个在线的EMAIL系统,当然还包含了IM的功能。现在在RFC中,这个协议的标准叫XMPP(Extensive Message  Presence Protocol),翻译成中文应该叫"扩展的消息在线协议"吧. 为什么是Extensive了,大家都知道XML吧,XMPP通信内容都是XML格式的.
   
1.JABBER的协议模型

     XMPP
      |
     SASL
      |
     TSL
      |
     TCP

2.JABBER的通讯模型
  

                 SERVER S1  --------  SERVER S2
               /            \                    |
              /              \                   |
    CLINET A            CLIENT B       CLIENT C


3.JABBER 服务端
    现在使用最广泛的就是Openfire:
    用JAVA写的,用WEB进行管理,方便而且简单.
    当然,使用这个服务端,一定要知道它实现了哪些协议,软件安装好后,在Document目录下面有
   有一个Protocol Support的Html文件.看看就知道了.

4.JABBER 客户端
    JABBER客户端软件很多,比如现在比较流行的Pandion和Exodus.后者是开源的是用Delphi写的;
  前者是FreeWare(免费软件),但是不开源.
    还有一个是咱们中国人写的,以前叫MYICQ,后来改名为LinQ了,地址为: ,看了P2P的实现那一小块,感觉不错。
    当然还有就是实现了XMPP协议的CODE LIBRARY.
    我现在用来测试的CODE LIBRARY为gloox,用C++写的,在WINDOWS 下面直接用VC6编译生成DLL和LIB
 文件,然后在自己的工程中就可使用它的库来开发程序了,当然也可以放在一起编译,在调试的时候还能跟踪进去.代码不是很大,我就把GLOOX的代码放上来了,见文章末.
  

5.参考   
   JABBER工程站点地址:
 
    在JABBER的中文站点,XMPP-CORE文档在如下地址:
%E6%96%87%E6%A1%A3%E5%88%97%E8%A1%A8
/XMPP%E6%AD%A3%E5%BC%8FRFC%E6%A0%87%E5%87%86/RFC3920
如果要使用已经实现的CODE LIBRARY 等等,也应该知道这个协议.


6.客户端如何直接传输语音和视频
      有一文在网上看到了,是"兵工自动化"杂志上的文章
      "2007年第1期摘录:基于Jabber协议的P2P通讯系统",
      没看到内容,介绍里面稍微说了一下这方面的内容吧,但就目前JABBER服务器提供的功能来说,好象不提供UDP/TCP Hole Punching.如果是扩展服务器COMPONENT的话,应该可以.不知道作者是怎么实现的.
     现在的服务器支持FILE TRANSFER,但是这是通过SERVER中转的,传输文本文件还行,要传输一个几百M的软件过去,我看服务器够呛的.
     可以参考我放在本BLOG上的P2P技术的文章,相信这样实现也是很简单的.

7.一个通信实现的XML例子
   基于gloox的example下的register_example程序和roster_example程序.
   前一个是注册的,后一个是通信的.
  下面S指的是消息从SERVER发出,C为消息从CLIENT发出.

TCP连接建立:connecting to a245427228c4407 (192.168.0.7:5222)
1.会话协商
C:
             xmlns='jabber:client'
         xmlns:stream='' 
         xml:lang='en' version='1.0'>
S:          xmlns='jabber:client' from='a245427228c4407' id='33450978'
         xml:lang='en' version='1.0'/>
2.服务端询问CLIENT支持什么安全认证
S:
        
             DIGEST-MD5
             PLAIN
             ANONYMOUS
             CRAM-MD5
        

        
             zlib
        

        
       
   

3.CLIENT给服务端请求要注册用户
C:
S:
       
           
           
           
           
           
                XMPP Client Registration
                Please provide the following information
               
                   jabber:iq:register
               

               
                  
               

               
               
               
                   
               

            

          

       

4.CLIENT根据服务端的要求提交用户信息
C:
       
          testuser
          testpwd
         
         
        

    

S:
5.CLIENT关闭注册的STREAM元素
C:


roster_example例:
   
      ROSTER过程
1.TCP连接
connecting to a245427228c4407 (192.168.0.7:5222)
2.会话协商
C:       xmlns='jabber:client'
      xmlns:stream='' 
      xml:lang='en' version='1.0'>
S:       xmlns='jabber:client' from='a245427228c4407' id='28cf95e9'
      xml:lang='en' version='1.0'/>
3.安全协商
S:
     
        DIGEST-MD5
        PLAIN
        ANONYMOUS
        CRAM-MD5
     

     
        zlib
     

     
     
   

C:
4.服务端就CLIENT的安全协议,发送测试数据(BASE64)
S: c
mVhbG09ImEyNDU0MjcyMjhjNDQwNyIsbm9uY2U9IkV6UzZXV2t1YzJVMkVoeEd3dGs4QjdwSll1cHpMV
HNxcU9WN0ZjdkIiLHFvcD0iYXV0aCIsY2hhcnNldD11dGYtOCxhbGdvcml0aG09bWQ1LXNlc3M=llenge>
C: d
XNlcm5hbWU9InRlc3R1c2VyIixyZWFsbT0iYTI0NTQyNzIyOGM0NDA3Iixub25jZT0iRXpTNldXa3VjM
lUyRWh4R3d0azhCN3BKWXVwekxUc3FxT1Y3RmN2QiIsY25vbmNlPSIwMDAwMDAyOTAwMDA0ODIzMDAwM
DE4YmUwMDAwNjc4NCIsbmM9MDAwMDAwMDEscW9wPWF1dGgsZGlnZXN0LXVyaT0ieG1wcC9hMjQ1NDI3M
jI4YzQ0MDciLHJlc3BvbnNlPWZmMTY0NTM2NmM5ZWI0NmQ5ZDE0Y2Y0ODk4ODMzNzgzLGNoYXJzZXQ9d
XRmLTg=

5.服务端安全测试成功
S: cnN
wYXV0aD1lY2U3NDBhMzg0NDVhMzRlNDJiZjg2MjQ2YmU0OWQzNA==


6.PRESENCE的SCENARIO开始,STREAM从新开启
C:      xmlns='jabber:client'
     xmlns:stream='' 
     xml:lang='en' version='1.0'>
S:       xmlns='jabber:client' from='a245427228c4407' id='28cf95e9'
      xml:lang='en' version='1.0'/>
7.PRESENCE的协商
S:
       
           zlib
       

       
       
   

C:
   
  

S:
    
       testuser@a245427228c4407/28cf95e9
    

   

C: 
S: 
      
    

C:
C:
S: >
S:
8.在线显示
C: 0
S:

C:
C:  from='testuser@a245427228c4407/28cf95e9'/>
C:

S:
S: bscription='to'/>

9.使服务端接受PRESENCE情况
C:

10.从用户user发送过来的消息,希望加为好友
S:
S: fea759d5f9f52b7
95d35dae169dbfcd0b8e5585b
8

S: bscription='both'/>

11.接受请求
C:
S: >
C: rosterTest0.9.3

12.接收从user发来的消息"hello"
S: hell
o hellos='jisp:x:jep-0038'>shinyicons

     消息: hello
    
文件:gloox-0.9.3.tar.bz2
大小:419KB
下载:下载

阅读(7704) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-05-08 18:26:42

我想应该能够控制把,我贴出来得例子,都是跟踵出来的

chinaunix网友2008-01-18 11:35:11

gloox的Roster请求似乎是自动发送的,能否手动控制?