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。

    今天就倒這裏把。

相關文章
相關標籤/搜索