以一個簡單聊天室的例子來說明一二。
socket在某種程度猶如C#中的介面,只要實現了介面即可,無需瞭解裡面複雜的TCP/IP包。舉個例子:硬碟壞了,重新買一個得時候,只要買了滿足插線的即可,而不需要知道硬碟的內部構造。
在通訊的過程中,則需要一個伺服器端,來接受用戶端發來的訊息,然後經過處理返回給需要的用戶端。例如:聊天室中,我登入之後,會發送一個訊息告訴伺服器我登入了(如果格式為Join|使用者名稱),然後伺服器會將我的訊息進行處理,System.Text.Encoding.Default.GetString(buffer).Split('|'),其中buffer為byte[]類型,訊息以流的形式發送。 用一個字串數組接受處理之後的資訊acceptMsg[0]=”Join”,acceptMsg[1]=使用者名稱,通過判斷acceptMsg[0]的指令為Join,則會告訴所有使用者,該使用者加入了聊天室。在QQ中,就是告訴他的所有好友,會有提示。
作為一個簡單的聊天室,用戶端會有幾個事件會觸發,也就是發送資訊給伺服器端。
為用戶端介面,會發送訊息的幾個事件分別為:登入,登出,發送(群聊),私聊發送。所以對以上四種訊息分別標記為:
登入:Join|使用者名稱 用join區別開來,目的是讓伺服器好區分開來資訊的類型,從而判斷用戶端的事件類型。
登出:Exit|使用者名稱
發送:Chat|使用者名稱|聊天內容
私聊:Priv|使用者名稱|私聊接受者|聊天內容
。
當然這些資訊都得需要一個伺服器來監聽。
為伺服器介面。
開啟服務之後,伺服器則會一直處於監聽狀態,
當客戶一旦發送訊息,伺服器就會接受到資訊並對其處理。它基本處理這樣的:
主要是利用System.Text.Encoding.Default.GetString(buffer).Split('|')方法來處理接受到得資訊。
acceptMsg[0]==”Join”,則會給所有使用者發送訊息,會有兩種訊息,第一是告訴所有使用者acceptMsg[1]加入了聊天室,第二是給所有使用者發送一個以“List|訊息內容”格式的訊息,來重新重新整理使用者線上列表。同理,用戶端接收到訊息亦要經過處理的。
acceptMsg[0]==”Exit”,伺服器接受到此訊息則會告訴所有使用者acceptMsg[1]離開了聊天室,並結束對該使用者的監聽線程。
acceptMsg[0]==”Chat”,伺服器則會在RichTextBox中顯示資訊accpetMsg[1];
accpetMsg[0]==”Priv”,伺服器則會只把訊息給使用者acceptMsg[2],訊息內容則為:acceptMsg[3];
基本流程圖如下
左為伺服器端,右為用戶端.
作者:餘意
出處:http://cnblogs.com/zabery
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。