服務器端是整個消息系統的中樞,相似與人類的大腦。沒有他,根本沒法實現客戶端之間的交流,爲何呢?這也涉及到咱們的系統涉及,在服務器端,每一個客戶端的標識數據都會在服務器端進行保存,在這種狀況下,當某一個客戶端請求與另一個客戶端進行交流時,咱們即可以在服務器端保存的客戶端列表中,找到目標客戶端,併發送消息。服務器
下面咱們就一步步來實現併發
咱們新建一個InChatter的解決方案,默認的項目能夠稍後再作處理,也但是刪除,咱們在項目中新建一個WCF服務庫(英文版本的朋友們自行參考)框架
在上圖中,咱們看到有WCF服務庫、WCF服務應用程序、WCF工做流服務應用程序,我簡單介紹下:ui
WCF服務庫須要咱們本身開發服務寄宿程序,而WCF服務應用程序是IIS寄宿方式的程序,是可直接運行的服務程序,.svc是服務契約文件,契約的定義和實如今.svc.cs文件中。spa
至於WCF工做流服務程序則是寄宿在工做流WorkFlow中的程序中的服務。3d
咱們如今回到咱們的項目中,如今咱們修改實現咱們的服務契約:code
1 using InChatter.Service.Data; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Runtime.Serialization; 6 using System.ServiceModel; 7 using System.Text; 8 9 namespace InChatter.Service 10 { 11 [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IChatCallback), Namespace = "https://inchatter.codeplex.com/")] 12 public interface IChat 13 { 14 [OperationContract(IsOneWay=false,IsInitiating=true,IsTerminating=false)] 15 void Login(string clientId); 16 17 [OperationContract(IsOneWay=true,IsInitiating=false,IsTerminating=false)] 18 void SendMsg(InChatterMessage message); 19 20 [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = true)] 21 void Logout(); 22 } 23 24 public interface IChatCallback 25 { 26 [OperationContract(IsOneWay=true)] 27 void ReceiveMsg(InChatterMessage message); 28 } 29 30 }
服務契約IChat:方法的實如今服務器端,表示客戶端能進行的操做,目前咱們的客戶端能夠登陸(Login)、註銷(Logout)以及發送消息(SendMsg)blog
服務回調契約IChatCallback:方法的實如今客戶端,表明服務器端能進行的操做開發
當客戶端調用Login方法時,服務器端將初始化Session,咱們這裏在登陸時將返回當前在線的客戶端id,當客戶端調用Logout時,服務器端將關閉會話,表示會話結束。而咱們的消息處理就是SendMsg和ReceiveMsg。某個客戶端調用SendMsg時,消息發送到服務器,服務器經過消息篩選,調用ReceiveMsg將消息發送給符合接受條件的客戶端,客戶端將處理接收到的消息,這個過程和SendMsg是一個徹底相反的過程。那麼下面咱們看看咱們的消息結構:get
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace InChatter.Service.Data 8 { 9 public class InChatterMessage 10 { 11 /// <summary> 12 /// 發送消息者ID 13 /// </summary> 14 public string SenderID { set; get; } 15 /// <summary> 16 /// 發送消息者名稱 17 /// </summary> 18 public string SenderName { set; get; } 19 /// <summary> 20 /// 接收消息者id 21 /// </summary> 22 public string ReceiverID { set; get; } 23 /// <summary> 24 /// 接收消息者名稱 25 /// </summary> 26 public string ReceiverName { set; get; } 27 28 /// <summary> 29 /// 消息類型:系統提醒(notice)、消息(msg)、上線提醒(logon)、下線提醒(logoff) 30 /// </summary> 31 public string Type { set; get; } 32 /// <summary> 33 /// 消息內容 34 /// </summary> 35 public string Content { set; get; } 36 /// <summary> 37 /// 消息時間 38 /// </summary> 39 public string SendTime { set; get; } 40 /// <summary> 41 /// 附加信息 42 /// </summary> 43 public string ExtendData { set; get; } 44 } 45 }
能夠看到,在消息結構中,Type定義了notice、msg、logon、logoff四個消息類型,整個系統過程當中的全部消息都被分爲這四種形式,這是咱們目前的消息結構。
如今服務端的基本框架已經有了,比較簡單。下一節咱們將實現IChat契約方法。