2008-09-20 66 views
2

根據我的理解,XMPP協議基於永遠在線的連接,您不知道XML消息何時結束。研究XMPP應用程序的線程實現有什麼好的資源?

這意味着您必須對它進行評估。這也意味着,可能需要處理異步連接,因爲套接字可能會阻塞在XML消息的中間,無論是由於消息長度或連接速度緩慢。

我將不勝感激每個答案的一個來源,所以我們可以改裝它們,看看最喜歡什麼。

回答

1

想要一次處理多個連接嗎?在這種情況下,必須使用良好的異步套接字處理來避免每個連接有一個線程。

否則,您只需要一個XML解析器,可以一次處理大塊字節。 Expat是典型的例子;如果您使用的是Java,請嘗試XP。這些類型的XML解析器將盡可能觸發事件,並緩存部分節,直到剩下的部分到達。

現在,爲了解決您的斷言結束時沒有通知,那不是真的。重要的是不要像處理一系列文檔一樣處理XML流。使用以下僞代碼:

stanza = null 
while parser has more: 
    switch on token type: 
    START_TAG: 
     elem = create element from parser state 
     if stanza is not null: 
     add elem as child of stanza 
     stanza = elem 
    END_TAG: 
     parent = parent of stanza 
     if parent is not null: 
     fire OnStanza event 
     stanza = parent 

此方法應該與基於事件或拉解析器一起使用。它只需要堅持一個值得狀態的指針。很明顯,你還需要處理屬性,字符數據,實體引用(如& amp等)和特殊用途的stream:stream標記,但這應該讓你開始。

0

Igniterealtime.org提供一種開源XMPP的服務器和客戶端用Java編寫的

+0

查看源代碼對我來說是非常好的,但在這種情況下,我需要一些有關數據線性的信息,而不是完整的實現。 無論如何。 – 2008-09-20 11:12:45

0

ejabberd被寫入的Erlang。我不知道ejabberd實現的細節,但使用Erlang的一個優勢是真正便宜的線程。我會推測他們每個XMPP連接啓動一個線程。在Erlang術語中,這些將被稱爲進程,但這些並不是受保護的內存地址空間,而是輕量級的用戶空間線程。

相關問題