XMPP的一些工作(再续)

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

    问题描述:

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

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

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

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

    所以问题就是为什么没有调用routintTable.routePacket()。 而是进入了local server的域中。

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

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

   简单的做可以加一行代码:

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

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

    今天就倒这里把。

你可能感兴趣的:(XMPP的一些工作(再续))