百度空间 | 百度首页 
 
查看文章
 
Python的pyxmpp库与Openfire不兼容问题
2009-02-19 23:54
最近由于Google App Engine宣称即将支持XMPP收发消息,所以就测试了一下Python的XMPP支持。

Python有2个XMPP library可供选择:xmpppypyxmpp。刚接触的开发人员通常会很关心它们究竟有什么区别,或者哪个更适合自己。一般公认的看法是 pyxmpp 是首选,它完全符合XMPP协议,开发也保持活跃的状态,并且最新的版本是2009年发布的。而xmpppy则公认为设计上有不太合理之处,也不完全符合XMPP协议,所以不推荐使用。

pyxmpp自带了几个examples,比如将c2s_test.py, 改下用户和密码和domain,就可以连接到任意标准的XMPP server。但是最近在测试用pyxmpp连接到openfire, 在验证了用户名和密码之后却会卡住,在屏幕上显示了这行信息之后就没有下文了。

creating stream...
connecting...
Creating client stream: <class pyxmpp.jabber.clientstream.LegacyClientStream at 0x82e1b9c>, auth_methods=['sasl:DIGEST-MD5', 'digest']

结论也就是说目前版本的 pyxmpp 是不能登录 Openfire 的。

后来在jive的论坛看到Openfire is incompatible with pyxmpp echobot,才确定这不是一个偶然现象。后面的原因竟然是openfire返回的iq bind的to不符合协议导致。
<iq type="result" id="46425" to="tim/abcdef">
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
    <jid>tim@server/python</jid>
</bind>
</iq>

按照XMPP RFC规范 rfc3920中的例子,在client bind成功之前,server给client是不需要带to的。
<iq type='result' id='bind_2'>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'>
    <jid>somenode@example.com/someresource</jid>
</bind>
</iq>

上面那篇文章在jive论坛已经而openfire社区已经很久时间了,但由于openfire的社区大部分开发人员都用smack, libjingle之类的客户端,大家也没发现这个问题,所以也没得到开发团队重视。

Openfire 的相关实现是在IQBindHandler.java中实现的,这里并没有明显的设置 to, 但由于IQHandler实现的上层会给每个包自动加上to, 所以就导致了这个现象。但如果要改这个逻辑就对openfire改动较大,也容易引起其他的问题。所以最简单的方法是在IQBindHandler里面设 置一个正确的to, 虽然没完全符合协议,但是可以避免目前pyxmpp遇到的类似问题。

结论是在在IQBindHandler.java增加一行即可解决pyxmpp不能登录的问题。

child.addElement("jid").setText(session.getAddress().toString());
// add the following line
reply.setTo(session.getAddress());

类别:Openfire | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu