<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[XMPP Jabber即时通讯开发实践]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[Tim&#39;s Blog about XMPP Jabber, 同时欢迎访问我的另一独立blog: http://timyang.net/]]></description>
<link>http://hi.baidu.com/jabber</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[Hemlock--开发多人实时web应用的flash框架]]></title>
        <link><![CDATA[http://hi.baidu.com/jabber/blog/item/3e24012323d179479258079b.html]]></link>
        <description><![CDATA[
		
		Multi-user real-time web 应用目前是一个热门的方向， 如上个月Google Wave的demo就有很酷的real-time gadget demo。这些实时的web应用包括普通的web协同应用，web game, 各种SNS扩展应用及SNS game等。<br>
<br>
此类应用前端实现有两种方式，socket/flash或ajax方式。为了达到实时效果，使用轮询的ajax通常占用服务器资源过大，目前逐渐被comet方式代替。服务器的实现通常需要开发者自行实现基于业务的socket server，但自己实现的server通常存在性能及可扩展性的问题，因此实现全部功能需要投入大量的开发精力。<br>
<br>
<a href="http://hemlock-kills.com/" target="_blank">Hemlock</a>是一套适合此场景的可扩展框架。它后端使用XMPP MUC chatroom作为多人交互应用的通道，通过flash长连到XMPP Server上。由于XMPP Server(如openfire, ejabberd等)本身就支持多服务器，因此使用默认的版本就可以支持上十万的并发，如果稍加优化，同时支持上百万用户也不会有太大问题。<br>
<br>
比如下图是用Hemlock实现一个多人聊天的实时白板程序，<a href="http://hemlock-kills.com/showcase/drawing/" target="_blank">真实demo</a><br>
<div forimg="1"><img border="0" src="http://hiphotos.baidu.com/jabber/pic/item/b48df403efc50daed53f7c73.jpg" small="0" class="blogimg"></div>
(图片来源：<a href="http://hemlock-kills.com/blog/hemlock-in-action" target="_blank">Fancy a draw? Hemlock in action</a>)<br>
<br>
另外官方网站还有一个<a href="http://football3s.com/" target="_blank">football3s</a>多人足球游戏的demo。<br>
<br>
安装Hemlock的文档可参阅<a href="http://hemlock-kills.com/learn" target="_blank">http://hemlock-kills.com/learn</a>，文档是以ejabberd为例的，经<a href="http://timyang" target="_blank">Tim</a>验证也可安装在openfire/Linux上。唯一需要注意的配置是SERVER必须和xmpp domain一致。开发的环境需要用到Flex SDK, Java, Ruby, Rake等。<br>
<br>
Hemlock底层使用jive的<a href="http://www.igniterealtime.org/projects/xiff/" target="_blank">XIFF</a> library, 在XMPP的基础上做了多人交互数据包的封装，并且大部分编程都可以基于事件机制，比较容易上手。大部分Web Game都有生命周期短，开发周期要求短的特点，因此使用Hemlock可以节约大量底层开发时间，有兴趣的朋友不妨一试。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jabber/blog/category/Xmpp">Xmpp</a>&nbsp;<a href="http://hi.baidu.com/jabber/blog/item/3e24012323d179479258079b.html#comment">查看评论</a>]]></description>
        <pubDate>2009-06-30  21:23</pubDate>
        <category><![CDATA[Xmpp]]></category>
        <author><![CDATA[iso1600]]></author>
		<guid>http://hi.baidu.com/jabber/blog/item/3e24012323d179479258079b.html</guid>
</item>

<item>
        <title><![CDATA[Google Wave与XMPP]]></title>
        <link><![CDATA[http://hi.baidu.com/jabber/blog/item/d821fbde89fb6c5c94ee3789.html]]></link>
        <description><![CDATA[
		
		本周发布的<a target="_blank" href="http://wave.google.com/">Google Wave</a>其中一个亮点就是<a target="_blank" href="http://www.waveprotocol.org/draft-protocol-spec">Google Wave Federation Protocol</a>(需翻墙)通讯协议基于XMPP。摘要如下<br>
<ul>
    <li>Federation 简单的解释就是分布式的互联互通，没有中心服务器。比如email, XMPP等系统都是federation的，任何公司没法对它进行控制。Google Wave Federation Protocol协议基于XMPP核心协议XMPP core [RFC3920]来扩展，实现多个wave服务器之间即时的交互通讯。</li>
    <li>Waves可以理解为一种支持实时通讯的多人文档(multi-user document)，它由一到多个wavelets构成。wavelet中包含一到多个具体的document。</li>
    <li>服务器之间通讯必须使用TLS(类似SSL)</li>
    <li>Wave 的创建服务器通常认为拥有此wave, 在协议中称为master, 所有修改及并发操作逻辑由master负责管理。其他外域用户的服务器实际上只起一个代理作用，将本域用户的操作发送到master。多个服务器通讯，协 议中的Client和Server都是相对的，因为实际上双方都是服务器。协议上把发起方视为client。因此从单一的wave对象来看，实际上还是一 个中心服务器的架构。</li>
</ul>
下图是官方协议介绍中的一个插图，可以看到所有的用户交互都需要通过master(authoritative server)来进行。<br>
<pre>Non-Authoritative         Authoritative<br>    Server                   Server<br>-----------------         -------------<br>     |                          |<br>     |  establish connection    |<br>     |  ---------------------&gt;  |<br>     |                          |<br>     |  send delta operation    |<br>     |  ---------------------&gt;  |<br>     |                          |<br>     |  receive response        |                  All non-authoritative<br>     |  &lt;---------------------  |                      servers with<br>                                |                      participants<br>                                |                      ----------<br>                                |  establish connection   |<br>                                |  --------------------&gt;  |<br>                                |                         |<br>                                |  send delta operation   |<br>                                |  --------------------&gt;  |<br>                                |                         |<br>                                |  receive response       |<br><br>                                |  &lt;--------------------  |</pre>
<ul>
    <li>从 协议来看，虽然Wave是XMPP的协议扩展，但和XMPP目前的体系并无具体的联系，没有互联互通(wave federation不等于xmpp federation)。没有presence(在线状态), message(消息), roster(联系人)。可能和很多人想像的不一样。它只是用XMPP协议来作为载体。打个比方就像写了一个socket服务程序，用pop3协议(或扩展)来实现多机传送文件，虽然协议是POP3, 但是这个体系跟邮件没什么关系。wave与XMPP的关系也是这样。</li>
    <li>从目前来看，Wave不会代替IM，因为它没有对Presence(在线状态)的定义，但用发展的眼光来看，如果一些extension可以把xmpp presence带入的话可能情况就会发生改变，如下所示，比较期待。</li>
</ul>
participant = XMPP roster<br>
wave = XMPP message<br>
extension = XMPP presence<br>
<br>
Google Wave更多介绍可参看我独立blog<a target="_blank" href="http://timyang.net/">Tim[后端技术]</a>的介绍文章<a href="http://timyang.net/google/google-wave/">从技术角度看Google Wave</a>，顺便抗议一下CSDN新闻频道抄过去这篇文章不加指向原文链接，明显的违反CC协议。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jabber/blog/category/Xmpp">Xmpp</a>&nbsp;<a href="http://hi.baidu.com/jabber/blog/item/d821fbde89fb6c5c94ee3789.html#comment">查看评论</a>]]></description>
        <pubDate>2009-05-31  21:52</pubDate>
        <category><![CDATA[Xmpp]]></category>
        <author><![CDATA[iso1600]]></author>
		<guid>http://hi.baidu.com/jabber/blog/item/d821fbde89fb6c5c94ee3789.html</guid>
</item>

<item>
        <title><![CDATA[我的又一Blog: Tim[后端技术]]]></title>
        <link><![CDATA[http://hi.baidu.com/jabber/blog/item/ae43c095cdacf743d0135e03.html]]></link>
        <description><![CDATA[
		
		本Blog不间断的坚持了两三年，最初的目的只是为了记录自己在学习扩展协议(那时候叫JEP, Jabber Extension Protocol)的一些心得, 后来逐渐把自己在实现服务器的各种编程开发，架构设计，甚至数据库设计都写进去，就一直延续到现在。其中也切身感受到类似日积月累的如 <a href="http://home.wangjianshuo.com/cn/20090321_ccee.htm" target="_blank">滴水理论</a> 给自己带来的技术的收获。<br>
<br>
为了使自己的技术思考具有更大的延续性及不受外界干扰的中立性，我去年底又启用了一个独立域名的Blog <a target="_blank" href="http://timyang.net/">Tim[后端技术]</a>， 希望能对技术思考与总结能够更长远不受干扰的延续下去。但我也不想简单的将目前Blog的文章全部copy过去，也不会停止这边的更新，尽量使老的和新的 Blog都具有延续性。只要两边的文章大家都能够自由访问，那我无需刻意再去作些额外的事情。因此XMPP相关文章继续在这里发表。有关架构，编程等内容 只会在新的Blog发表。<br>
<br>
新空间最新部分文章，欢迎使用RSS阅读器订阅 <a href="http://timyang.net/feed/" target="_blank">http://timyang.net/feed/</a><br>
<ul>
    <li><a href="http://timyang.net/architecture/friendfeed-like-aggregator/">Ideas for creating a friendfeed like feed aggregator system</a></li>
</ul>
实现friendfeed类似系统的一些需求与架构设想<br>
<ul>
    <li><a href="http://timyang.net/programming/thrift-protocol-buffers-performance-java/">Thrift and Protocol Buffers performance in Java<br>
    </a></li>
    <li><a href="http://timyang.net/programming/thrift-protocol-buffers-java-howto/">Thrift, Protocol Buffers installation and Java code howto </a></li>
</ul>
Thrift 是 facebook 开源的跨语言，高性能RPC框架;<br>
Protocol Buffers 是 Google 开源的可用于服务器内部通讯的一种高效可扩展的数据交换格式。<br>
虽然使用的场合不同，但实际还是有一定的类似关系，最近比较了它们在Java环境下的性能差异。<br>
<ul>
    <li><a href="http://timyang.net/web/nginx-module/">如何写nginx module </a></li>
</ul> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jabber/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/jabber/blog/item/ae43c095cdacf743d0135e03.html#comment">查看评论</a>]]></description>
        <pubDate>2009-04-06  23:54</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[iso1600]]></author>
		<guid>http://hi.baidu.com/jabber/blog/item/ae43c095cdacf743d0135e03.html</guid>
</item>

<item>
        <title><![CDATA[Present.ly = XMPP + Twitter + LinkedIn]]></title>
        <link><![CDATA[http://hi.baidu.com/jabber/blog/item/d3b2751ed6fc54fc1ad5763b.html]]></link>
        <description><![CDATA[
		
		<ul>
    <li><a href="http://www.presentlyapp.com/" target="_blank">Present.ly</a>是一个偏商务方面的初创型公司的应用，用户可以通过Present.ly进入一个公司的network来micro-blogging或者update status，他们自称是 = Twitter + LinkedIn</li>
    <li>Present.ly 使用 ejabberd 作为通讯平台, 目前国外使用 ejabberd 的系统越来越多，比如最近另外一个初创服务 <a target="_blank" href="http://drop.io/">drop.io</a> 也使用 <a target="_blank" href="http://drop.io/blog/asset/your-drops-are-now-alive-private-filesharing-and-collaboration-goes-truly-real-time">ejabberd 作为通讯平台</a>。见下文引用的说明。</li>
</ul>
Present.ly<br>
<blockquote><em>You may have noticed near-instant updates on the new web interface&mdash;this is primarily due to the super-fast messaging features of eJabberd, the XMPP server that Present.ly runs on<br>
</em></blockquote>drop.io<br>
<blockquote><em>We are using ejabberd, which is known for its high level of compliance with XMPP. On the front end we use the Strophe javascript library, which uses a technique called Bidirectional-streams Over Synchronous HTTP (BOSH) to connect to a Jabber server.</em><br>
</blockquote>
<ul>
    <li>Openfire最近一两年在大规模集群方面停滞不前，而基于erlang的ejabberd天生具有良好的分布式及可扩展性，因此受到国外 很多初创项目的青睐。尽管如此，对于国内同时在线人数小于30万规模的应用，我建议还是采用Openfire，它易用性强，门槛低，更容易扩展。而大规模的互联网应用可以考虑基于ejabberd。</li>
    <li>除ejabberd外，Present.ly大部分应用都是基于ruby开发。</li>
    <li>另外产品上，感觉Present.ly目前的定位(商务网络+twitter)被facebook可替代性比较强。</li>
</ul> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jabber/blog/category/Xmpp">Xmpp</a>&nbsp;<a href="http://hi.baidu.com/jabber/blog/item/d3b2751ed6fc54fc1ad5763b.html#comment">查看评论</a>]]></description>
        <pubDate>2009-04-06  23:35</pubDate>
        <category><![CDATA[Xmpp]]></category>
        <author><![CDATA[iso1600]]></author>
		<guid>http://hi.baidu.com/jabber/blog/item/d3b2751ed6fc54fc1ad5763b.html</guid>
</item>

<item>
        <title><![CDATA[留言选登: 关于openfire承受的并发用户量]]></title>
        <link><![CDATA[http://hi.baidu.com/jabber/blog/item/dc689f2b854c2ef2e6cd40a7.html]]></link>
        <description><![CDATA[
		
		<a href="http://passport.baidu.com/?business&amp;un=seaboyHe" target="_blank" title="http://passport.baidu.com/?business&amp;un=seaboyHe">seaboyHe</a><br>
楼主您好，有个问题请教，目前OpenFire是否支持分布式Server，单台服务器（Intel双核2.8，4G内存）能支持多少用户同时在线？谢谢了<br>
<br>
匿名网友<br>
回复seaboyHe：据称2006年的时候我看到说是可以支持33K并发 但是目前来看 貌似 单台服务器 支持5K+应该没问题  我现在用的OpenFire 3.63 我做个测试 使用多台服务器 互相联系 很方便 以前 看到一个帖子说 他的每个线程 占用内存为4KB 理论上 支持30W用户应该可以  但是 OpenFire 团队 现在一直对这个负载能力 遮遮掩掩的 没有在实际的应用中是很难 得到一个准确的 数字的 但是我相信 不管他的负载能力有多大 我们使用分布式的服务器 也一定可以达到恐怖级别的负载的 希望 在这方面 有研究 或者 正在研究的朋友跟我多多交流 大家整合下自己的东西 互相学习下 本人 目前在开发一个基于OpenFire 的IM系统！本人QQ:21999481             <br>
<br>
<a href="http://hi.baidu.com/jabber" target="_blank">Tim</a><br>
很多打算采用openfire的朋友第一件事就是了解openfire的容量，因为开源版的openfire不支持clustering，所以这确实是一个很重要的问题。在openfire+connection manager的配合下，openfire在1台8G的主流服务器支持30万用户肯定没有问题，当然需要部署更多的connection manager作为前端来支持。openfire的瓶颈主要在内存占用方面，根据另外一位资深同事的优化尝试，如果将session内存占用优化，session里面尽量不用集合类，跑到40-50万用户也能稳定运行。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jabber/blog/category/Openfire">Openfire</a>&nbsp;<a href="http://hi.baidu.com/jabber/blog/item/dc689f2b854c2ef2e6cd40a7.html#comment">查看评论</a>]]></description>
        <pubDate>2009-03-11  13:22</pubDate>
        <category><![CDATA[Openfire]]></category>
        <author><![CDATA[iso1600]]></author>
		<guid>http://hi.baidu.com/jabber/blog/item/dc689f2b854c2ef2e6cd40a7.html</guid>
</item>

<item>
        <title><![CDATA[Jabber.org每月一次的MUC聊天活动]]></title>
        <link><![CDATA[http://hi.baidu.com/jabber/blog/item/0cf99651598c142c42a75bd3.html]]></link>
        <description><![CDATA[
		
		上个月说到<a target="_blank" href="../../jabber/blog/item/b88c16177ed820064a90a7b7.html">关注XMPP OPEN DAY</a>， 最近Peter Saint-Andre又组织一个类似的每月一次MUC聊天活动，首次时间在3/12 20:00 UTC (北京时间 3/13 周五 4:00am)，地址 jdev@conference.jabber.org，这是一个标准的MUC房间，任何jabber客户端通过任何支持federation(s2s) 功能的服务器都可以进入，讨论的主题可能有:<br>
<ul>
    <li>XEP扩展协议是不是太多了，看得好晕？Too many <a href="http://xmpp.org/extensions/">XEPs</a>!</li>
    <li>Not enough developer-friendly documentation &mdash; can we build out the <a href="http://xmpp.org/tech/">tech pages</a> or a wiki?</li>
    <li>Can&rsquo;t we use Relax NG instead of W3C XML Schema?</li>
    <li>Where&rsquo;s that [user|developer]-friendly [client|library|server] written in [insert favorite code language here]?!?</li>
    <li>XMPP people are trying to do too much (pubsub, voice, video, microblogging, etc.).</li>
    <li>XMPP people aren&rsquo;t doing enough (why haven&rsquo;t we killed off [AIM|MSN|Skype] yet?)!</li>
    <li>There&rsquo;s not enough coordination and cross-pollination among projects.</li>
    <li>[Add your idea/complaint/rant in the comments or on the <a href="http://mail.jabber.org/mailman/listinfo/jdev">jdev list</a>.]</li>
</ul>
详情见 <a target="_blank" href="https://stpeter.im/?p=2528">Let&rsquo;s Mix &lsquo;em Up!</a><br>
<br>
另外 Peter 有意将 jabber.org 改造成一个由社区驱动的2.0版本，包括在上面提供基于jabber的 web chat room，提供资源给jabber社区进行各种前沿试验，包括VoIP。见<a target="_blank" href="https://stpeter.im/?p=2534">A Vision</a> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jabber/blog/category/Xmpp">Xmpp</a>&nbsp;<a href="http://hi.baidu.com/jabber/blog/item/0cf99651598c142c42a75bd3.html#comment">查看评论</a>]]></description>
        <pubDate>2009-03-11  13:01</pubDate>
        <category><![CDATA[Xmpp]]></category>
        <author><![CDATA[iso1600]]></author>
		<guid>http://hi.baidu.com/jabber/blog/item/0cf99651598c142c42a75bd3.html</guid>
</item>

<item>
        <title><![CDATA[XMPP业界近态]]></title>
        <link><![CDATA[http://hi.baidu.com/jabber/blog/item/cfe9a101f79f80011c958374.html]]></link>
        <description><![CDATA[
		
		<strong>Facebook Chat 最新进展<br>
</strong>Facebook很多个月之前就说打算提供一个XMPP的网关，支持所有客户使用第三方XMPP客户端登录。但是这个任务迟迟没有完成。Engineering @ Facebook's Notes 提到了<a href="http://www.facebook.com/note.php?note_id=51412338919" target="_blank">最新的进展</a><br>
<ul>
    <li>最近几个月都在紧张的忙着改bug :)</li>
    <li>用户从10个月前的7千万增加到目前的1.75亿</li>
    <li>其中2/3的用户用过facebook chat</li>
    <li>最复杂的实现据称是作为HTTP网关的channel server，是erlang实现的，存放推送给客户端的message</li>
    <li>presence server收集所有的cluster下用户的presence,并可一次返回用户的所有好友状态，逻辑简单, 但是传输的数据用zlib进行了压缩</li>
    <li>chatloggers是c++实现的，主要瓶颈在malloc，由于太多内存碎片造成</li>
    <li>监控服务器运行有2种方法，erlang支持attach一个pid做实时分析; 另外用了Scribe来收集日志。</li>
</ul>
Scribe可参看前文 <a target="_blank" href="../../jabber/blog/item/e92107b33c7b7da0d9335ab2.html">使用 Scribe 来监控大型网络系统</a><br>
Facebook chat介绍也可参看前文 <a target="_blank" href="../../jabber/blog/item/2ef2bab759447ef130add138.html">Facebook chat 技术架构摘要</a><br>
<br>
<strong>Google App Engine将支持XMPP收发消息</strong><br>
见<a href="http://googleappengine.blogspot.com/2009/02/roadmap-update.html" target="_blank">A roadmap update!</a><br>
<span class="status-body"><span class="entry-content"><br>
<strong>支持Silverlight的XMPP library</strong><br>
<a target="_blank" href="http://blog.ag-software.de/?p=26">MatriX</a> is a XMPP library for Microsoft Silverlight web development written in c#.  <br>
</span></span>Flash有XIFF的libary, 那Silverlight也有MatriX了。另外ag-software这个公司更有名的产品是.net平台的libary - agsXMPP, 国内几年前就有不少公司在用这个库了。<br>
<br>
<strong><a target="_blank" href="http://xmpp.org/summit/summit6.shtml">XMPP Summit 6</a> - Jingle Thingle</strong><br>
2/6 - 2/9 在Brussels举办的，主要的讨论都是Jingle音视频传输方面的，见<a target="_blank" href="http://mail.jabber.org/pipermail/jingle/2009-February/000536.html">raw notes from Jingle Thingle</a> 大部分话题也可以在 <a target="_blank" href="http://mail.jabber.org/pipermail/jingle/2009-February/thread.html">Jingle mail list</a> 上看到<br>
<br>
<strong>pubsub and djabberd视频</strong><br>
今天Brad(djabberd及memcached作者)又在yahoo传道<a target="_blank" href="http://www.veodia.com/player.php?vid=fCNU1qQ1oSs">XMPP</a>， 同时还讨论的XMPP pubsub和另外一种所谓的web hook技术的比较。这两种技术在API接口的领域(比如Twitter API)需求极为迫切，可参看更多&quot;<a target="_blank" href="http://groups.google.com/group/webhooks/browse_thread/thread/e305e9c59aaf5001">web hooks</a>&quot;讨论<br>
<br>
<strong>黑莓与XMPP</strong><br>
尽管黑莓上已经有第三方软件支持XMPP，但还是有黑客大声呼吁RIM应该增加官方的支持。<a target="_blank" href="http://www.jasonsalas.com/2009/02/open-letter-to-rim-about-im-network.html">An open letter to RIM about IM interop for BlackBerries</a> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jabber/blog/category/Xmpp">Xmpp</a>&nbsp;<a href="http://hi.baidu.com/jabber/blog/item/cfe9a101f79f80011c958374.html#comment">查看评论</a>]]></description>
        <pubDate>2009-02-20  00:50</pubDate>
        <category><![CDATA[Xmpp]]></category>
        <author><![CDATA[iso1600]]></author>
		<guid>http://hi.baidu.com/jabber/blog/item/cfe9a101f79f80011c958374.html</guid>
</item>

<item>
        <title><![CDATA[Python的pyxmpp库与Openfire不兼容问题]]></title>
        <link><![CDATA[http://hi.baidu.com/jabber/blog/item/dfa3f51f10b2790d304e159a.html]]></link>
        <description><![CDATA[
		
		最近由于<a href="http://googleappengine.blogspot.com/2009/02/roadmap-update.html" target="_blank">Google App Engine宣称即将支持XMPP收发消息</a>，所以就测试了一下Python的XMPP支持。<br>
<br>
Python有2个XMPP library可供选择：<a target="_blank" href="http://xmpppy.sourceforge.net/">xmpppy</a> 和 <a target="_blank" href="http://pyxmpp.jajcus.net/">pyxmpp</a>。刚接触的开发人员通常会很关心它们究竟有什么区别，或者哪个更适合自己。一般公认的看法是 pyxmpp 是首选，它完全符合XMPP协议，开发也保持活跃的状态，并且最新的版本是2009年发布的。而xmpppy则公认为设计上有不太合理之处，也不完全符合XMPP协议，所以不推荐使用。<br>
<br>
pyxmpp自带了几个examples，比如将c2s_test.py, 改下用户和密码和domain，就可以连接到任意标准的XMPP server。但是最近在测试用pyxmpp连接到openfire, 在验证了用户名和密码之后却会卡住，在屏幕上显示了这行信息之后就没有下文了。<br>
<br>
creating stream...<br>
connecting...<br>
Creating client stream: &lt;class pyxmpp.jabber.clientstream.LegacyClientStream at 0x82e1b9c&gt;, auth_methods=['sasl:DIGEST-MD5', 'digest']<br>
<br>
<strong>结论也就是说目前版本的 pyxmpp 是不能登录 Openfire 的。</strong><br>
<br>
后来在jive的论坛看到<a target="_blank" href="http://www.igniterealtime.org/community/thread/35966">Openfire is incompatible with pyxmpp echobot</a>，才确定这不是一个偶然现象。后面的原因竟然是openfire返回的iq bind的to不符合协议导致。<br>
&lt;iq type=&quot;result&quot; id=&quot;46425&quot; to=&quot;tim/abcdef&quot;&gt;<br>
&lt;bind xmlns=&quot;urn:ietf:params:xml:ns:xmpp-bind&quot;&gt;<br>
&nbsp;&nbsp;&nbsp;     &lt;jid&gt;tim@server/python&lt;/jid&gt;<br>
&lt;/bind&gt;<br>
&lt;/iq&gt;<br>
<br>
按照XMPP RFC规范 <a target="_blank" href="http://xmpp.org/rfcs/rfc3920.html#bind">rfc3920</a>中的例子，在client bind成功之前，server给client是不需要带to的。<br>
&lt;iq type='result' id='bind_2'&gt;<br>
&lt;bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'&gt;<br>
&nbsp;&nbsp;&nbsp;     &lt;jid&gt;somenode@example.com/someresource&lt;/jid&gt;<br>
&lt;/bind&gt;<br>
&lt;/iq&gt;<br>
<br>
上面那篇文章在jive论坛已经而openfire社区已经很久时间了，但由于openfire的社区大部分开发人员都用smack, libjingle之类的客户端，大家也没发现这个问题，所以也没得到开发团队重视。<br>
<br>
Openfire 的相关实现是在IQBindHandler.java中实现的，这里并没有明显的设置 to, 但由于IQHandler实现的上层会给每个包自动加上to, 所以就导致了这个现象。但如果要改这个逻辑就对openfire改动较大，也容易引起其他的问题。所以最简单的方法是在IQBindHandler里面设 置一个正确的to, 虽然没完全符合协议，但是可以避免目前pyxmpp遇到的类似问题。<br>
<br>
<strong> 结论是在在IQBindHandler.java增加一行即可解决pyxmpp不能登录的问题。</strong><br>
<br>
child.addElement(&quot;jid&quot;).setText(session.getAddress().toString());<br>
// add the following line<br>
<strong>reply.setTo(session.getAddress());</strong> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jabber/blog/category/Openfire">Openfire</a>&nbsp;<a href="http://hi.baidu.com/jabber/blog/item/dfa3f51f10b2790d304e159a.html#comment">查看评论</a>]]></description>
        <pubDate>2009-02-19  23:54</pubDate>
        <category><![CDATA[Openfire]]></category>
        <author><![CDATA[iso1600]]></author>
		<guid>http://hi.baidu.com/jabber/blog/item/dfa3f51f10b2790d304e159a.html</guid>
</item>

<item>
        <title><![CDATA[XMPP/Jabber服务器的SRV DNS配置]]></title>
        <link><![CDATA[http://hi.baidu.com/jabber/blog/item/9e203d2afb62be3f5343c1d2.html]]></link>
        <description><![CDATA[
		
		通常XMPP client连接服务器是无须指定IP的，比如登录 gtalk, 只需填入账号 username@gmail.com 及密码，标准的客户端都可以自动解析需要的服务器和端口连接到服务器上。这个解析就是通过DNS的SRV record来实现的。<br>
<br>
标准的 XMPP client解析的流程为(以timyang.net为例)<br>
<ol>
    <li>解析 &quot;_xmpp-client._tcp.timyang.net&quot; ，获得连接的服务器和端口;</li>
    <li>如果失败，则解析 &quot;_jabber._tcp.timyang.net&quot;，这个主要针对老的服务器配置;</li>
    <li>如果还是失败，则客户端认为该域没有配置SRV记录，则直接解析&quot;timyang.net&quot;并使用默认端口5222连接。</li>
</ol>
SRV配置方法可参看：<a href="http://en.wikipedia.org/wiki/SRV_record" target="_blank">SRV record</a><br>
<br>
具体的格式为<br>
_Service._Proto.Name TTL Class SRV Priority Weight Port Target<br>
<br>
可使用 Linux 命令 dig 查看设置结果。<br>
<pre><br>$ dig -t SRV _xmpp-client._TCP.gmail.com<br><br>; &lt;&lt;&gt;&gt; DiG 9.4.2-P2 &lt;&lt;&gt;&gt; -t SRV _xmpp-client._TCP.gmail.com<br>;; global options:  printcmd<br>;; Got answer:<br>;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 53058<br>;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0<br><br>;; QUESTION SECTION:<br>;_xmpp-client._TCP.gmail.com.&nbsp;&nbsp;   IN&nbsp;&nbsp;   SRV<br><br>;; ANSWER SECTION:<br>_xmpp-client._TCP.gmail.com. 85182 IN&nbsp;&nbsp;   SRV&nbsp;&nbsp;   20 0 5222 talk3.l.google.com.<br>_xmpp-client._TCP.gmail.com. 85182 IN&nbsp;&nbsp;   SRV&nbsp;&nbsp;   20 0 5222 talk4.l.google.com.<br>_xmpp-client._TCP.gmail.com. 85182 IN&nbsp;&nbsp;   SRV&nbsp;&nbsp;   5 0 5222 talk.l.google.com.<br>_xmpp-client._TCP.gmail.com. 85182 IN&nbsp;&nbsp;   SRV&nbsp;&nbsp;   20 0 5222 talk1.l.google.com.<br>_xmpp-client._TCP.gmail.com. 85182 IN&nbsp;&nbsp;   SRV&nbsp;&nbsp;   20 0 5222 talk2.l.google.com.<br><br>;; Query time: 202 msec<br>;; SERVER: 208.67.222.222#53(208.67.222.222)<br>;; WHEN: Tue Jan 20 10:29:59 2009<br>;; MSG SIZE  rcvd: 234</pre>
<br>
<br> 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jabber/blog/category/Xmpp">Xmpp</a>&nbsp;<a href="http://hi.baidu.com/jabber/blog/item/9e203d2afb62be3f5343c1d2.html#comment">查看评论</a>]]></description>
        <pubDate>2009-01-20  10:35</pubDate>
        <category><![CDATA[Xmpp]]></category>
        <author><![CDATA[iso1600]]></author>
		<guid>http://hi.baidu.com/jabber/blog/item/9e203d2afb62be3f5343c1d2.html</guid>
</item>

<item>
        <title><![CDATA[关注 XMPP OPEN DAY]]></title>
        <link><![CDATA[http://hi.baidu.com/jabber/blog/item/b88c16177ed820064a90a7b7.html]]></link>
        <description><![CDATA[
		
		XMPP Open Day是一个<a href="http://metajack.im/" target="_blank">jack moffitt</a>发起的有关<a href="http://www.xmpp.org/" class="external text" title="http://www.xmpp.org" rel="nofollow">XMPP</a>协议完全online的活动，不用坐飞机，也不用去美国，就可以参与一次有高手演讲的互动活动。它使用的是XMPP多人聊天MUC(<a href="http://www.xmpp.org/extensions/xep-0045.html">multi-user chat</a>)的方式来进行，任何人都可以参与。<br>
<br>
目前大概确定了有5名左右专家有意愿演讲，确定了大约6个议题。所有可能的议题包括：<br>
<ul>
    <li>XMPP primer</li>
    <li>tutorials on writing XMPP bots and components</li>
    <li>XMPP server setup tutorials</li>
    <li>Jingle</li>
    <li>PubSub</li>
    <li>microblogging</li>
    <li>MOM (Message-Oriented Middleware)</li>
</ul>
它的时间预计在2009年1月中旬，时间为北京时间23:00-7:00左右(15:00 UTC to 23:00 UTC)，国内人员要参加可能稍不方便一点。<br>
<br>
了解最新时间安排及进展可看它的wiki：<a target="_blank" href="http://wiki.jabber.org/web/XMPP_Open_Day">XMPP OPEN DAY</a><br>
<br>
另外2/6-2/9在欧洲还有一个 <a href="http://xmpp.org/summit/summit6.shtml">6th XMPP Summit</a> 的活动，会议会讨论<a href="http://xmpp.org/tech/jingle.shtml">Jingle</a>开发方面的话题。 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/jabber/blog/category/Xmpp">Xmpp</a>&nbsp;<a href="http://hi.baidu.com/jabber/blog/item/b88c16177ed820064a90a7b7.html#comment">查看评论</a>]]></description>
        <pubDate>2009-01-09  23:16</pubDate>
        <category><![CDATA[Xmpp]]></category>
        <author><![CDATA[iso1600]]></author>
		<guid>http://hi.baidu.com/jabber/blog/item/b88c16177ed820064a90a7b7.html</guid>
</item>


</channel>
</rss>