說到聊天,那么其實就是傳輸數據,把自己寫的東西傳給自己想發送的那么人。我總結一下傳輸常見的有三種方式
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:建立事件的目的是為了把信息傳給前台進行顯示
第六步:客戶端實現
請參照我傳的源碼
第七步:看看運行效果
單聊效果

群聊效果:


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