我們一起學習WCF 第九篇聊天功能


說到聊天,那么其實就是傳輸數據,把自己寫的東西傳給自己想發送的那么人。我總結一下傳輸常見的有三種方式

1:就是我們常見的數據庫傳輸

2:就是文件(流)傳輸

3:就是socket傳輸

今天我們說的wcf實現聊天其實是基於socket的聊天功能

今天我先說說基於WCF聊天的原理

1:需要一個回調函數(當用戶發送的時候會吧信息回調給客戶端本身)

2:需要一個委托(把服務器傳來的信息顯示給前台)

3:需要一個觸發點擊事件(目的是為了觸發把發送信息傳到服務器)

基本主要由以上三個就能完成這個簡單的聊天功能,下面我用圖來描述我這個程序的基本流程

ok現在和我一起進行編碼:

第一步:我們建立回調接口

1    [ServiceContract]
2   public interface ICallBack
3     {
4         [OperationContract(IsOneWay = true)]
5         void SendMessage(string nick, string Onick, string content, DateTime sendTime);
6     }

第二步:我們建立兩個類,一個作為返回用戶登錄信息類,一個用戶發送信息類

 1 ///
 2 發送類
 3 ///
 4 public class SendInfo
 5     {
 6        /// <summary>
 7        /// 發送者名字
 8        /// </summary>
 9        public string SendName { get; set; }
10        /// <summary>
11        /// 接受者名字
12        /// </summary>
13        public string RevName { get; set; }
14        /// <summary>
15        ///  發送內容
16        /// </summary>
17        public string SendContent { get; set; }
18        /// <summary>
19        /// 發送時間
20        /// </summary>
21        public DateTime SendTime { get; set; }
22        /// <summary>
23        /// 聊天模式(0表示群聊,1表示單聊)
24        /// </summary>
25        public int State { get; set; }
26     }
27 ///
28 錯誤信息
29 ///
30 
31     [DataContract]
32    public class ResultMessage
33     {
34         /// <summary>
35         /// 錯誤信息
36         /// </summary>
37         [DataMember]
38         public string ErrorMessage { set; get; }
39         /// <summary>
40         /// 是否登錄成功
41         /// </summary>
42         [DataMember]
43         public bool IsTrue { set; get; }
44     }

第三步:建立契約

 1   [ServiceContract(CallbackContract = typeof(ICallBack), SessionMode = SessionMode.Required)]
 2    public interface IChatService
 3     {
 4         [OperationContract( IsInitiating = true, IsTerminating = false)]
 5         ResultMessage Login(string UserName, string Pwd);
 6         [OperationContract(IsOneWay = true)]
 7         void sendMessage(SendInfo sendInfo);
 8         [OperationContract(IsInitiating = false, IsTerminating = true)]
 9         ResultMessage End(string UserName);
10     }

第四步:實現功能

 1  public void sendMessage(SendInfo sendInfo)
 2         {
 3             if (sendInfo.State == 0)
 4             {
 5                 if (Clients != null)
 6                 {
 7                     foreach (ICallBack cb in Clients.Values.ToArray())
 8                     {
 9                         if (cb != null)
10                         {
11                             cb.SendMessage(sendInfo.SendName, sendInfo.RevName, sendInfo.SendContent, sendInfo.SendTime);
12                         }
13                     }
14                 }
15             }
16             else
17             {
18                 if (Clients.ContainsKey(sendInfo.RevName))
19                 {
20                     ICallBack cb1 = Clients[sendInfo.RevName];
21                     cb1.SendMessage(sendInfo.SendName, sendInfo.RevName, sendInfo.SendContent, sendInfo.SendTime);
22                     ICallBack cb2 = Clients[sendInfo.SendName];
23                     cb2.SendMessage(sendInfo.SendName, sendInfo.RevName, sendInfo.SendContent, sendInfo.SendTime);
24                 }
25                 else
26                 {
27                     ICallBack cb = Clients[sendInfo.SendName];
28                     cb.SendMessage(sendInfo.SendName, sendInfo.RevName, "對方不在線", sendInfo.SendTime);
29                 }
30             }     
31         }

注釋1:Clients.Values.ToArray() 獲取所有的用戶信息,然后得到通道給每一個用戶發送信息

注釋2:ICallBack cb1 = Clients[sendInfo.RevName]; 獲取回調接口,然后通過接口來返回用戶發送信息

第五步:客戶端實現回調接口

  public event EventHandler<CallbackRecEventArgs> ChatEvent;
        public void SendMessage(string NickOne, string NickTwo, string Message, DateTime sendTime)
        {
            CallbackRecEventArgs crg = new CallbackRecEventArgs(NickOne, NickTwo, Message, sendTime);
            ChatEvent(this, crg);
        }

注釋3:建立事件的目的是為了把信息傳給前台進行顯示

第六步:客戶端實現

請參照我傳的源碼

第七步:看看運行效果

單聊效果

群聊效果:

如果遇到什么地方不懂的可以私信給我

附上源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM