分享WCF聊天程序--WCFChat实现代码

2019-12-30 11:02:31于海丽
  •   namespace WCFChatService 
  • {  // InstanceContextMode.PerSession 服务器为每个客户会话创建一个新的上下文对象。ConcurrencyMode.Multiple 异步的多线程实例 
  • [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]  public class ChatService : IChatService 
  • {  private static Object syncObj = new Object();////定义一个静态对象用于线程部份代码块的锁定,用于lock操作 
  • IChatCallback callback = null;   
  • public delegate void ChatEventHandler(object sender, ChatEventArgs e);//定义用于把处理程序赋予给事件的委托。  public static event ChatEventHandler ChatEvent;//定义事件 
  • static Dictionary<string, ChatEventHandler> chatters = new Dictionary<string, ChatEventHandler>();//创建一个静态Dictionary(表示键和值)集合(字典),用于记录在线成员,Dictionary<(Of <(TKey, TValue>)>) 泛型类   
  • private string name;  private ChatEventHandler myEventHandler = null; 
  •    
  • public string[] Join(string name)  { 
  • bool userAdded = false;  myEventHandler = new ChatEventHandler(MyEventHandler);//将MyEventHandler方法作为参数传递给委托 
  •   lock (syncObj)//线程的同步性,同步访问多个线程的任何变量,利用lock(独占锁),确保数据访问的唯一性。 
  • {  if (!chatters.ContainsKey(name) && name != "" && name != null) 
  • {  this.name = name; 
  • chatters.Add(name, MyEventHandler);  userAdded = true; 
  • }  } 
  •   if (userAdded) 
  • {  callback = OperationContext.Current.GetCallbackChannel<IChatCallback>();//获取当前操作客户端实例的通道给IChatCallback接口的实例callback,此通道是一个定义为IChatCallback类型的泛类型,通道的类型是事先服务契约协定好的双工机制。 
  • ChatEventArgs e = new ChatEventArgs();//实例化事件消息类ChatEventArgs  e.msgType = MessageType.UserEnter;