根據我的理解,XMPP協議基於永遠在線的連接,您不知道XML消息何時結束。研究XMPP應用程序的線程實現有什麼好的資源?
這意味着您必須對它進行評估。這也意味着,可能需要處理異步連接,因爲套接字可能會阻塞在XML消息的中間,無論是由於消息長度或連接速度緩慢。
我將不勝感激每個答案的一個來源,所以我們可以改裝它們,看看最喜歡什麼。
根據我的理解,XMPP協議基於永遠在線的連接,您不知道XML消息何時結束。研究XMPP應用程序的線程實現有什麼好的資源?
這意味着您必須對它進行評估。這也意味着,可能需要處理異步連接,因爲套接字可能會阻塞在XML消息的中間,無論是由於消息長度或連接速度緩慢。
我將不勝感激每個答案的一個來源,所以我們可以改裝它們,看看最喜歡什麼。
想要一次處理多個連接嗎?在這種情況下,必須使用良好的異步套接字處理來避免每個連接有一個線程。
否則,您只需要一個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標記,但這應該讓你開始。
Igniterealtime.org提供一種開源XMPP的服務器和客戶端用Java編寫的
ejabberd被寫入的Erlang。我不知道ejabberd實現的細節,但使用Erlang的一個優勢是真正便宜的線程。我會推測他們每個XMPP連接啓動一個線程。在Erlang術語中,這些將被稱爲進程,但這些並不是受保護的內存地址空間,而是輕量級的用戶空間線程。
查看源代碼對我來說是非常好的,但在這種情況下,我需要一些有關數據線性的信息,而不是完整的實現。 無論如何。 – 2008-09-20 11:12:45