2019独角兽企业重金招聘Python工程师标准>>>
当出现问题的时候,能够从容淡定的去面对,去寻找解决方法。朝着这个方向继续的前进。
问题描述:
用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。
今天就倒这里把。