XMPP的一些工做(再续)

    当出现问题的时候,可以从容淡定的去面对,去寻找解决方法。朝着这个方向继续的前进。java

    问题描述:服务器

    用smack 3.2.1 搭建了两个client。openfire作服务器。当一个client向另一个client发送IQ包的时候,openfire会回503 service-unavaliable。dom

    打开openfire的源码: IQRouter.java 里面有一个函数叫handle(IQ packet)。在这个函数里面会判断packet的To address是不是local server。若是是的话就用这个packet里面的namespace去找到对应的IQHandler去处理。ide

    我发的IQ包就走到这个逻辑里面,由于我用的namespace是自定义的。因此在根据namespace去找IQHandler的时候就找不到,因此openfire就回复503。函数

    找到这个根源后,就开始分析缘由。自定义的namespace应该不是问题。不能为每个新的自定义的namespace去写一个IQHandler。根据通常的想法:openfire应该找到接受者的链接,而后在这个链接上把packet路由过去。spa

    因此问题就是为何没有调用routintTable.routePacket()。 而是进入了local server的域中。server

    原来To address是一个bare JID, 接收者链接到server的时候虽然没有指定resource。可是smack会缺省指定一个resource:Smack。 因此真正的To address应该是: name@domain/Smack. 发送者应该把这个full JID 做为To address。接口

   在接收者一侧的代码也须要作一点点改动。目的就是为了解析新的namespace。路由

   简单的作能够加一行代码:get

   ProviderManager.getInstance().addIQProvider(YOUR_ELEMENT,YOUR_NAMESPACE, new YourIQProvider());

   固然须要实现YourIQProvider(). 它实现了IQProvider。实现这个接口的方法去解析packet。

    今天就倒这里把。

相关文章
相关标签/搜索