我们一起学习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:建立事件的目的是为了把信息传给前台进行显示

第六步:客户端实现

请参照我传的源码

第七步:看看运行效果

单聊效果

群聊效果:

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

附上源码

posted @ 2015-07-26 23:34  朝向远方  阅读(1897)  评论(4编辑  收藏  举报