MSN傳送訊息的過程

2021-05-31 22:45:46 字數 2653 閱讀 3559

我們直入正題。msnpsharp的訊息傳送機制的確和大部分人想的不太一樣,一般人概念上傳送訊息就乙個步驟:呼叫自己寫的 send***x 函式(該函式實現向某個使用者傳送網路資料)就可以直接實現向對方通訊了。其實這樣做要有個前提,那就是你的send***函式(下文簡稱send)在被呼叫的時候,要麼它能同步地(是的,同步很重要)找到你要的目標使用者,並且立即建立連線傳送資料,要麼它就把和對方握手、緩衝向目標使用者建立連線成功之前輸入資料這些功能封裝了,以至於呼叫者根本看不見這些步驟。然而,遺憾的是,為了能讓程式設計師更靈活地控制傳送訊息的各個步驟,msnpsharp的sbmessagehandler.sendtextmessage函式設計不符合以上所有假設。換言之,你必須自己處理連線中的所有過程。很多人看到這裡可能會覺得這樣做實在太麻煩,其實不然,只要你了解了msn向對方傳送訊息的整個過程就會覺得很簡單了。要使用msnpsharp向你的好友傳送訊息,首先必須建立乙個conversation物件,這個物件可以通過呼叫messenger類的createconversation函式獲得。建立了conversation就可以通話了麼?答案是否定的,因為這個conversation這時候只有你乙個人,就好比你要向乙個朋友通**,你直接拿起話筒就能和對方說話麼?於是下一步我們該幹什麼呢?讓我們回到通**的那個例子上來。我們拿起話筒,理所當然做的第二件事情就是——撥號。msnpsharp也一樣,你得「撥號」把對方邀請到你的conversation裡面來,這很簡單,呼叫你先前得到的那個conversation物件的invite函式,那個函式只有乙個引數,就是目標好友的windows live 帳號(前提是他沒有block你),或者乾脆就是你目標好友的contact物件。完事了麼?很明顯沒有。你撥號了之後還得等人接了才能通話。當然在現實生活中完成這個動作很簡單:你只需要拿著話筒等待就可以了,因為撥號的這個過程是線性的(或者說是同步的),動作乙個接乙個地發生。但是寫程式就沒有那麼走運了,要知道invite對方直到對方響應可能是乙個很長的過程,如果是同步的話,那麼可能需要等待很長的時間,以至於你不得不建立多條執行緒來處理每乙個invite.所以msnpsharp採用的是非同步+事件通知的設計:invite後invite函式立即返回,當對方「接聽」後,會在conversation.switchbrard觸發乙個事件:contactjoined ,這個時候你才可以用 conversation.switchboard.sendtextmessage向對方傳送訊息。通常很多人在contactjoined事件之前就向對方呼叫sendtextmessage,那結果只有乙個:傳送失敗。如果在contactjoined事件之前ui又有幾條訊息要被指定傳送,那麼建議先用個佇列或陣列之類儲存這些訊息,等contactjoined事件觸發了之後再傳送。事情看上去大功告成了。但是不得不告訴各位乙個壞訊息,提供通話服務的msn「電信局」很吝嗇,如果你倆通話過程中超過30秒到一分鐘一言不發,它會把你們的通話掐斷(事實上應該是如果對方使用的是官方的msn客戶端,對方主動退出,據測試)。這個時候 conversation.switchbard 的 contactleft 事件會被觸發,通知你對方使用者退出conversation,conversation.switchboard.contacts.count屬性會自減1,表示在此conversation裡面的contact少了乙個。(如果乙個conversation裡面所有對方使用者都退出了,會觸發allcontactsleft事件,這時可以直接呼叫conversation.switchboard.close()關閉conversation)這時問題就來了,如果我想向乙個因為長時間不傳送訊息而退出的使用者重新傳送訊息該怎麼辦呢?恩,是的,重新呼叫messanger. createconversation再建立乙個conversation invite他們一次。但是請記住就是,在他們left之前把退出的使用者記錄下來,要不然你不知道該重新邀請誰,還有,千萬別忘記,在contactjoin之前把要傳送的訊息緩衝,join之後才能傳送。

最後加一句,所有的示例**都可以在msnpsharp的那個example客戶端看到。

//本**取自

msnpsharpexampleclientconversationform.cs

privatevoidswitchboard_contactjoined(objectsender,contacteventargse)

; args[0]=sender;

args=e;

conversationtextbox.invoke(d,args);//執行緒切換

} else

_messagequene.clear();

} if(_nudgequene.count0)

_nudgequene.clear();

} }

} privatevoidswitchboard_contactleft(objectsender,contacteventargse)

); }

else }

voidswitchboard_allcontactsleft(objectsender,eventargse)

//傳送訊息

privatevoidsendinput()

conversation.switchboard.sendtextmessage(message);//傳送訊息

}//重新邀請

privateboolreinvite()

_leftusers.clear();

returntrue;

} returnfalse;

}

MSN使用過的個人訊息

1 能者就列,不能者止 當時剛剛進入一家公司寫 但是不屬於該公司的正式員工。但是又處在一種可以留下,或是走人的情況中。所以才使用了這句話。2 舉杯邀明月,對影成三人 在上一家公司寫 兩年後,去了另外一家軟體公司,公司的規模很小,30到40人。進入了新的環境,沒有了說話的朋友 做地鐵13號線,上地站下...

同步方式的訊息傳送和非同步方式的訊息傳送

通訊有兩類不同的基本方式 具有依時性的同步方式以及與時間無關的非同步方式。訊息傳送中介軟體有許多不同型別,它們分別都能夠支援一類基本方式的訊息通訊,有時可以支援兩類方式。根據定義,同步執行的特徵為 在兩個通訊應用系統之間必須要進行同步,兩個系統必須都在正常執行,並且會中斷客戶端的執行流,轉而執行呼叫...

同步方式的訊息傳送和非同步方式的訊息傳送

通訊有兩類不同的基本方式 具有依時性的同步方式以及與時間無關的非同步方式。訊息傳送中介軟體有許多不同型別,它們分別都能夠支援一類基本方式的訊息通訊,有時可以支援兩類方式。根據定義,同步執行的特徵為 在兩個通訊應用系統之間必須要進行同步,兩個系統必須都在正常執行,並且會中斷客戶端的執行流,轉而執行呼叫...