MSN協(xié)議簡單分析_第1頁
MSN協(xié)議簡單分析_第2頁
MSN協(xié)議簡單分析_第3頁
MSN協(xié)議簡單分析_第4頁
MSN協(xié)議簡單分析_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、本設(shè)計(jì)主要實(shí)現(xiàn)登錄、退出MSN Server服務(wù)器,并分析MSN Client協(xié)議,實(shí)現(xiàn)MSN客戶之間的通訊。 1. 即時通訊軟件簡介 即時通訊軟件是通過即時通訊技術(shù)來實(shí)現(xiàn)在線聊天、交流的軟件,目前中國最流行的QQ、MSN、POPO、UC等,而國外主要使用ICQ、MSN。 即時通訊(Instant Messaging)透過即時通訊功能,你可以知道你的親友(朋友)是否正在線上,及與他們即時通訊。即時通訊比傳送電子郵件所需時間更短,而且比撥電話更方便,無疑是網(wǎng)絡(luò)年代最方便的通訊方式。 即時通訊(Instant messaging,簡稱IM)是一個終端服務(wù),允許兩人或多人使用網(wǎng)路即時的傳遞文字信息、

2、文件、語音與視頻交流。 MSN Messenger是Microsoft開發(fā)的聊天工具,目前在世界使用率第一的即時通訊軟件。微軟將MSN Messenger與Windows系統(tǒng)進(jìn)行捆綁,并憑借用戶廣泛的Hotmail平臺吸引了大量用戶,使得MSN Messenger很快便家喻戶曉。相比于騰迅的QQ,MSN Messenger除了具有更好的國際化支持之外,它還具有更適合商務(wù)使用的特點(diǎn)。成為企業(yè)職員們相互通信的首選工具,并且其用戶群體還在日益擴(kuò)大。 2. MSN協(xié)議簡介 “MSN Messenger”這個說法并不十分明確,微軟使用這個術(shù)語涉及到了若干不同通訊解決方案。MSN Messenger Ne

3、twork是微軟提供的即時通訊會話網(wǎng)。在個人微機(jī)上的程序統(tǒng)稱為MSN Messenger“客戶端”,它通過Internet連接到一個MSN Messenger“服務(wù)器”。更籠統(tǒng)的說就是,客戶端通過服務(wù)器與其他客戶端交互信息。在大多數(shù)時間里,客戶端與服務(wù)器會話,服務(wù)器處理這些會話信息并通知其他人。 微軟提供了兩個MSN Messenger客戶端:MSN Messenger(也被稱為“.Net Messenger”)和Windows Messenger。微軟從未正式公布過他們的MSN Messenger Server,并且官方客戶端不被允許連接到服務(wù)器除非微軟自己。盡管如此,許多人還是開發(fā)了第三方

4、的服務(wù)器。 兩臺計(jì)算機(jī)通訊中需要的“語言”被稱為“協(xié)議”,MSN Messenger客戶端與服務(wù)器間交互信息的規(guī)則被稱為“MSN Messenger 協(xié)議”,而經(jīng)由服務(wù)器從一個客戶端傳遞到另一個客戶端的信息規(guī)則在這里被稱為“MSN Client 協(xié)議”。 3. MSN Message協(xié)議 MSN Messenger協(xié)議由若干客戶端與服務(wù)器發(fā)送的命令組成。例如,當(dāng)客戶端聯(lián)系人中的某人離線時,服務(wù)器將發(fā)送類似信息到客戶端:FLN myname_123,客戶端收到此消息后,便將此人從在線用戶列表中去除,并添加到離線用戶列表中。MSN Messenger協(xié)議包括MSN Clien

5、t協(xié)議和MSN Server協(xié)議。 3.1 MSN協(xié)議工作模式 MSN Messenger是一個列席式即時交互系統(tǒng),“列席式”意味著不管你是否在線,也不管你是否有一個攝像頭等客觀條件?!凹磿r交互”意味著能與其他用戶進(jìn)行會話。系統(tǒng)中的用戶都被視為同等級別的,RFC 2778給出了一個列席式即時交互系統(tǒng)很好的概述。 一個MSN Messenger會話包含一個到“通知服務(wù)器”(簡稱“NS”)的連接,NS將提供一個列席服務(wù)。通知服務(wù)器允許你連接到“交換服務(wù)器”(簡稱“SB”),它將提供一個即時通訊服務(wù)。 3.1.1 通知服務(wù)器(NS) 建立到通知服務(wù)器的連接是MSN Messenger會話的基礎(chǔ),因?yàn)?/p>

6、它保留著你的會話期間在線信息:如果你離線,對于你的伙伴來說你也將離線。通知服務(wù)器的目的主要就是保留你的在線信息,還有其他你所關(guān)心的重要人員的信息。 通知服務(wù)器同樣也提供其他通知服務(wù),如hotmail的新郵件提示和讓你創(chuàng)建(或者加入)交換會話等。當(dāng)你直接加入一個交換會話中時,你應(yīng)該打開一個到交換板的新的連接,并且保持通知服務(wù)器打開。 3.1.2 交換板(SB) 交換板保存了各人員的即時會話信息,換句話說,每個MSN中的用戶對應(yīng)連接到一個共享交換板的會話中。在同一時刻有兩個會話意味著要同時連接兩個交換服務(wù)器。在MSN Messenger中不能直接在各用戶間建立連接,并且交換板的作用就像你與對話人之

7、間的代理一樣。SB也可以邀請其他服務(wù),例如文件傳輸、視頻會議。 注意:SB和NS結(jié)合的并不十分緊密。例如,當(dāng)交換板會話中變更他(她)的顯示名時,交換板發(fā)送的信息或命令中仍舊使用舊名稱。另外某個用戶從NS中退出,所有的交換板會話都將保持打開狀態(tài)直到客戶端明確的關(guān)閉他們。 4. MSN登錄協(xié)議 MSN客戶端與服務(wù)器間信息都是以命令格式傳遞的。命令被描述為三個字符、所有字母大寫的命令代號。所有一般命令都有一個事務(wù)ID并且以新行結(jié)束。客戶端發(fā)送的命令一般會使服務(wù)器響應(yīng)一個及以上的命令。 有四種特殊類型的命令,它們的表現(xiàn)略不同于一般命令。有效載荷命令可以跨越多行。錯誤命令的命令代碼部分的字母替換為數(shù)字。

8、異步命令是不經(jīng)客戶端明確請求由服務(wù)器端發(fā)送的,而且并不包含事務(wù)ID。最后是PNG命令和一些SYN應(yīng)答,也不包含事務(wù)ID。 4.1 MSN登錄認(rèn)證 所有的到MSN服務(wù)器連接都是建立在TCP/IP之上的??蛻舳送ǔ⑾蛲獾倪B接到服務(wù)器。MSN Messenger的官方端口是1863,盡管如此,協(xié)議中多處可以指定相應(yīng)端口。MSN Messenger會話首先應(yīng)該登錄到通知服務(wù)器,如果有通知服務(wù)器IP地址,就直接連接,否則,就必須連接到“分派服務(wù)器”,官方客戶端使用,端口1863的分派服務(wù)器作為直接的SOCK連接,并使用gateway.messenger.h

9、,80端口作為分布服務(wù)器的HTTP連接。如果想連接到第三方的MSN Messenger網(wǎng)絡(luò),應(yīng)該使用不同的分布服務(wù)器。 如果首先連接到一個通知服務(wù)器,那么你就處于“登錄”處,包含了協(xié)議版本驗(yàn)證,身份驗(yàn)證,如果當(dāng)前服務(wù)器超負(fù)荷,還有可能轉(zhuǎn)移到其他通知服務(wù)器。 登錄期間,服務(wù)器行為與通常情況不同,通信是本質(zhì)上同步的,客戶端發(fā)送一個命令,服務(wù)器響應(yīng),客戶端發(fā)送另一個命令。如果在錯誤的時候發(fā)送了一個命令(如正當(dāng)協(xié)議版本在洽談時,你發(fā)送了一個VER命令),服務(wù)器會返回715錯誤,并斷開。如果發(fā)送了登錄期間無意義的命令(如SYN),將立即被斷開,并得到一個錯誤。登錄期外不需要遵守此規(guī)則

10、。 4.2 退出MSN 登出 要登出NS的話(MSN會發(fā)送你的斷線信息給每個人),最簡單的方法就是關(guān)閉Socket。如果你非正常斷開(如你使用了Modem,并被斷開),你仍將在線幾分鐘,但不能響應(yīng)。 正確的方法是發(fā)送OUT命令到NS服務(wù)器,不用攜帶任何參數(shù)及事務(wù)ID。服務(wù)器將立即斷開連接。參照協(xié)議草案中的說明,服務(wù)器應(yīng)該發(fā)回OUT,但實(shí)際中,從來就沒有這樣做過。 有時服務(wù)器會主動關(guān)閉連接,可能有兩個原因:服務(wù)器要down掉,或者有人在別處用你的賬號登錄到了MSN。 當(dāng)有人在別處用你的賬號登錄時,原來的連接將被關(guān)閉,新連接將被建立。關(guān)閉連接前,NS將給客戶端發(fā)送OUT命令并攜帶參數(shù)OTH 聯(lián)系人

11、從另外一個地點(diǎn)登錄。 當(dāng)服務(wù)器要進(jìn)行維護(hù)時,將會發(fā)送OUT SSD server shutting down,發(fā)送后就立即關(guān)閉連接。 4.3 MSN消息 MSN消息是通過有效載荷命令發(fā)送的,一個有效載荷命令是一種特殊形式的命令,它包含了若干行。對于它最好的理解是,一個正規(guī)單行命令后加了一堆二進(jìn)制數(shù)據(jù)(有效載荷)。最后的參數(shù)總是指定了其中所包含的字節(jié)數(shù)。 不同于其他命令,有效載荷命令沒有通用的格式,他們的格式就是每個特殊的有效載荷命令所指定的那樣。不要試圖象正規(guī)命令流一樣找出在那里結(jié)束有效載荷命令不易定義新行結(jié)束。你必須通過讀取命令中指定的字節(jié)數(shù)來讀取有效載荷中具體的數(shù)目的字節(jié)。 有些有效載荷命

12、令包含事務(wù)ID,有些則不包含。命令中可以包含任意數(shù)目的參數(shù),但最后一個參數(shù)總是一個正整數(shù)。這個正整數(shù)用來標(biāo)識有效載荷的字節(jié)數(shù),命令中必然指定并限制了有效載荷的長度。在有效載荷長度后,象其他命令一樣加上一個新行,然后組成了整個有效載荷命令。有效載荷的長度按字節(jié)計(jì)算。隨后,一般的命令就可以繼續(xù)了。 發(fā)送一個有效載荷命令非常簡單。大多數(shù)編程語言都包含有計(jì)算發(fā)送字符串字節(jié)數(shù)的函數(shù)(可能叫“l(fā)en()”或者類似函數(shù)),用這個函數(shù)計(jì)算出有效載荷的長度。計(jì)算時,不要包括命令本身和命令末尾新行的長度。 注意:服務(wù)器會按提供的長度提取信息,如果你要發(fā)送88個字節(jié),但你指出了87,服務(wù)器就會一直等待,直到你再發(fā)送

13、點(diǎn)什么,那將提取下一個命令中的首個字節(jié)作為有效載荷的末尾字節(jié),你將結(jié)束當(dāng)前發(fā)送到服務(wù)器的非法命令。如果信息長度太短,一樣會出現(xiàn)類似問題。 接收有效載荷命令時會更困難寫。你不能依靠一個包中的整條命令,也不能就以新行作為結(jié)束。應(yīng)該讀取指定的消息長度,然后從socket讀取自最初的新行后指定長度的字節(jié)數(shù)。 消息是協(xié)議中最早,可論證的最重要的有效載荷命令,通過MSG命令來實(shí)現(xiàn)。消息對我們來說太普遍,并且被NS和SB使用著。 接收MSG的時候,該命令總是不包含事務(wù)ID,并在有效載荷長度參數(shù)前有兩個參數(shù)。第一個參數(shù)是源消息賬號,第二個是URL編碼的源顯示名。NS上,賬號名和顯示名總是Hotmail(即使不

14、是一個合法的郵件地址),或許應(yīng)該被更正。BS上,兩個參數(shù)是源消息的賬號名和顯示名。 當(dāng)發(fā)送消息時,你必須包含一個事務(wù)ID,還有一個參數(shù)指定了到服務(wù)器的認(rèn)證。你只能在SB會話中發(fā)送消息,而不是NS會話中。 發(fā)送消息時,因?yàn)榉?wù)器不會中斷有效載荷,所以你可以在有效載荷中發(fā)送任何東西,只要不是太長,并且有效載荷長度參數(shù)正確就可以。但是,有效載荷中的信息最好用特殊方法格式規(guī)范一下。 有點(diǎn)類似MIME,每條消息被分成頭和主體部分,然后頭與主體之間用一個空白新行分隔。消息頭應(yīng)該采用RFC 1521中所描述的標(biāo)準(zhǔn)MIME頭那樣,由一個無序的字段列表組成,其間用新行分隔,每個新行必須是rn,否則官方客戶端就不

15、能正確理解。 每個字段包含一個關(guān)鍵字和一個值,例如: preferredEmail: 關(guān)鍵字應(yīng)該是大小寫敏感的,第三方的客戶端應(yīng)該如文檔所述大小寫一致。關(guān)鍵字最后必須加冒號,這里的冒號應(yīng)該是關(guān)鍵字的一部分,而且也是關(guān)鍵字的結(jié)束符,然后是空格。關(guān)鍵字只能在最后出現(xiàn)冒號,值之間可以有。例如,文件傳輸中,一個客戶端可能會發(fā)送: Request-Data: IP-Address: 另一臺客戶端可能返回: IP-Address: 5 附加參數(shù)可以在任意字段中指定,每個參數(shù)用分號加空格分隔,并且應(yīng)該關(guān)鍵字/值應(yīng)該成對出現(xiàn),并以等號分隔。如下字段

16、中,包含五個參數(shù): X-MMS-IM-Format: FN=Arial; EF=I; CO=ff0000; CS=0; PF=22 由于字段是無序的,客戶端必須做好接收任意次序的字段列表,拋開這些,對于官方客戶端來說,總是會按照相同的順序發(fā)送字段。同樣一個客戶端也必須能夠接收未知字段,并忽略它們。例如Gaim將包含一個如下字段: User-Agent: Gaim/0.59 每個合法的信息需要指定Content-Type字段,用來標(biāo)識消息類型。每個消息也應(yīng)該包含MIME-Version字段,但如果沒有這個字段的話,官方客戶端仍能顯示信息。 4.4 MSN消息主體 消息的主體幾乎可以是任何東西。如

17、果消息頭部指定了主體消息是UTF-8編碼的,那么主體部分應(yīng)該進(jìn)行UTF-8編碼。這并不影響消息長度。你必須按照原始字節(jié)數(shù)計(jì)算消息長度,而不是“字符”個數(shù)。 在正規(guī)文本消息中,官方客戶端用rn添加新行,這些在信息中被解釋為斷行符。注意,官方客戶端僅解析r,所以你可以以r結(jié)束一行,也會同rn一樣工作良好,但n作為行結(jié)束符將會出錯。所以你接收信息時應(yīng)該按r處理。所有的n實(shí)際上都被官方客戶端忽略了。 消息沒有主體是有可能的。如果你在頭部結(jié)束后以兩個新行結(jié)束消息,就可以實(shí)現(xiàn)一個空的主體。 4.5 Java實(shí)現(xiàn)代碼和Web發(fā)送消息頁面 /* * * param cmail :發(fā)送到的用戶email。 *

18、param msg :msn消息內(nèi)容 * param writeToDb : 是否將消息內(nèi)容寫入數(shù)據(jù)庫 */ public boolean sendMessage(Email cmail, String msg, boolean writeToDb) try MsnUserStatus status = messenger.getOwner().getStatus(); dispMsnContactStatus(status); if( ! status.equals(MsnUserStatus.ONLINE) ) this.start(); messenger.getOwner().setStatus(MsnUserStatus.ONLINE); catch( java.lang.IllegalStateException e) /e.printStackTrace()

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論