XMPP就是Jabber協議的正式名稱。其核心協議就是一個通過socket等媒介發送XML的規范。非常簡單,好實現。
先是通過socket建立一個網絡連接
然后客戶端向服務器發送一個<stream:stream....>這樣的XML開始標簽
然后服務器會返回一個<stream:stream...>這樣的標簽,作為握手信號
然后這就標志著雙方可以開始XML流的互通了
斷開似乎不需要發送</stream:stream>,但也不一定,需要再詳細閱讀一下協議。目前是直接斷開socket連接,并沒有多大問題。
中間的XML流的互通的形式是<iq id='abc'>...</iq>這樣的一個XML節(XML Stanza)的發送過去然后服務器用<iq id='abc'>...</iq>這樣的XML節來回應。目前核心協議規定的XML節有三個presence, iq, message。
綜觀整體的協議溝通的過程,就是把一個完整的XML文件一段一段的發送過去,<stream>是根節點,然后每次發送的是根節點下的那些次根節點。
所以目前用Delphi實現需要三個類:
TXMPPClient(繼承自TIdTCPCustom)
TXMPPListenerThread(繼承自TIdThread,因為這個Thread比VCL那個要好用一些。需要專門的偵聽線程是因為XMPP沒有像HTTP那樣有明確的一問一答的應答形式。像message這種XML Stanza可能在任何時候到達。所以需要一個專門的偵聽線程不斷的從系統的Socket Stack中把東西讀出來)
TXMPPProtocol(這個用來實現基于核心協議之上的那些表達即時通訊邏輯的網絡通訊邏輯,比如發送消息啊,上線啊這些。作為TXMPPClient的事件的接收者)
目前實現的核心在TXMPPClient上,需要四個基本的功能,Connect(連接上之后自動發送<stream開始標簽,并且能判斷是否握手成功),Send Stanza(發送一個XML節),Stanza Received(當收到一個XML節的時候調用所有注冊的回調函數),Disconnect(斷開連接,干凈安全)。即便就這簡單的四個功能也需要Client和偵聽線程的同步與配合,并不是太簡單無味的事情。等明天晚上具體把這些都實現了就可以開始著手吧上層協議一項項做出來了。
先是通過socket建立一個網絡連接
然后客戶端向服務器發送一個<stream:stream....>這樣的XML開始標簽
然后服務器會返回一個<stream:stream...>這樣的標簽,作為握手信號
然后這就標志著雙方可以開始XML流的互通了
斷開似乎不需要發送</stream:stream>,但也不一定,需要再詳細閱讀一下協議。目前是直接斷開socket連接,并沒有多大問題。
中間的XML流的互通的形式是<iq id='abc'>...</iq>這樣的一個XML節(XML Stanza)的發送過去然后服務器用<iq id='abc'>...</iq>這樣的XML節來回應。目前核心協議規定的XML節有三個presence, iq, message。
綜觀整體的協議溝通的過程,就是把一個完整的XML文件一段一段的發送過去,<stream>是根節點,然后每次發送的是根節點下的那些次根節點。
所以目前用Delphi實現需要三個類:
TXMPPClient(繼承自TIdTCPCustom)
TXMPPListenerThread(繼承自TIdThread,因為這個Thread比VCL那個要好用一些。需要專門的偵聽線程是因為XMPP沒有像HTTP那樣有明確的一問一答的應答形式。像message這種XML Stanza可能在任何時候到達。所以需要一個專門的偵聽線程不斷的從系統的Socket Stack中把東西讀出來)
TXMPPProtocol(這個用來實現基于核心協議之上的那些表達即時通訊邏輯的網絡通訊邏輯,比如發送消息啊,上線啊這些。作為TXMPPClient的事件的接收者)
目前實現的核心在TXMPPClient上,需要四個基本的功能,Connect(連接上之后自動發送<stream開始標簽,并且能判斷是否握手成功),Send Stanza(發送一個XML節),Stanza Received(當收到一個XML節的時候調用所有注冊的回調函數),Disconnect(斷開連接,干凈安全)。即便就這簡單的四個功能也需要Client和偵聽線程的同步與配合,并不是太簡單無味的事情。等明天晚上具體把這些都實現了就可以開始著手吧上層協議一項項做出來了。
浙公網安備 33010602011771號