InChatter系統之服務器開發(一)

服務器端是整個消息系統的中樞,相似與人類的大腦。沒有他,根本沒法實現客戶端之間的交流,爲何呢?這也涉及到咱們的系統涉及,在服務器端,每一個客戶端的標識數據都會在服務器端進行保存,在這種狀況下,當某一個客戶端請求與另一個客戶端進行交流時,咱們即可以在服務器端保存的客戶端列表中,找到目標客戶端,併發送消息。服務器

下面咱們就一步步來實現併發

咱們新建一個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契約方法。

相關文章
相關標籤/搜索