/// <summary> /// 用户退出系统 /// </summary> /// <param name="user"></param> public void Leave(CommunicationUser user) { try { if (user == null) { return; } lock (m_SyncObjForOnlyOneLoginUsers) { m_OnlyOneLoginUsers.Remove(user); } lock (m_SyncObjForCurrentOnLineUsers) { m_CurrentOnLineUsers.Remove(user); } RemoveUserInDGV(user); } catch (Exception ex) { throw ex; } }
public void Join(string name) { try { if (name == "" || name == null) { return; } //实例化通讯用户对象 CommunicationUser user = new CommunicationUser { UserID = name.Split('_')[0], UserName = name.Split('_')[1], IP = name.Split('_')[2], ProcessID = name.Split('_')[3] }; Join1(user); Join2(user); } catch (Exception ex) { throw ex; } }
/// <summary> /// DGV中增加指定用户 /// </summary> /// <param name="user"></param> private void AddUserInDGV(CommunicationUser user) { try { DataTable dt = FormMain.DGVAllCurrentUsers.DataSource as DataTable; if (dt == null) { dt = new DataTable(); dt.Columns.Add("USERID"); dt.Columns.Add("USERNAME"); FormMain.DGVAllCurrentUsers.DataSource = dt; } if (dt.Rows.Cast <DataRow>().Where((dr) => { return(dr["USERID"].ToString() == user.UserID); }).Count() == 0) { DataRow dr = dt.NewRow(); dr["USERID"] = user.UserID; dr["USERNAME"] = user.UserName; dt.Rows.Add(dr); } } catch (Exception ex) { throw ex; } }
/// <summary> /// 用户离开 /// </summary> public void UserLeave(CommunicationUser user) { if (m_MainForm != null) { m_MainForm.Close(); } }
public void Leave(string userID, string userName) { CommunicationUser user = new CommunicationUser { UserID = userID, UserName = userName, IP = GetCurrentHostIP(), ProcessID = GetCurrentProcessID() }; proxy.Leave(user); }
public override bool Equals(object obj) { CommunicationUser user = obj as CommunicationUser; if (user != null) { return(this.ToString().Equals(user.ToString())); } else { return(false); } }
/// <summary> /// DGV中移除指定用户 /// </summary> /// <param name="user"></param> private void RemoveUserInDGV(CommunicationUser user) { try { DataTable dt = FormMain.DGVAllCurrentUsers.DataSource as DataTable; if (dt != null) { var users = (from DataRow dr in dt.Rows where dr["USERID"].ToString().Equals(user.UserID) select dr).ToList(); users.ForEach((dr) => { dt.Rows.Remove(dr); }); } } catch (Exception ex) { throw ex; } }
/// <summary> /// 发送消息 /// </summary> /// <param name="message"></param> /// <param name="userFrom"></param> /// <param name="userTo"></param> public void SendMessage(string message, CommunicationUser userFrom, CommunicationUser userTo) { //给指定的用户发送消息 ChatEventArgs e = new ChatEventArgs(); e.MessageType = MessageType.UserLeave; e.User = userTo; e.Message = userFrom.UserName + ": " + message; //循环将在线的用户广播信息 var users = (m_CurrentOnLineUsers.Where((pair) => { return(pair.ToString() == userTo.ToString()); })).ToList(); users.ForEach((pair) => { pair.Value.GetInvocationList().ToList().ForEach((handler) => { ((CommunicationEventHandler)handler).BeginInvoke(this, e, null, null); }); }); }
/// <summary> /// 记录当前在线的用户 /// </summary> /// <param name="name"></param> /// <param name="user"></param> void Join2(CommunicationUser user) { try { lock (m_SyncObjForCurrentOnLineUsers)//线程的同步性,同步访问多个线程的任何变量,利用lock(独占锁),确保数据访问的唯一性。 { //记录下当前登录的用户 //if ((m_CurrentOnLineUsers.Where((pair) => { return pair.Key.ToString() == user.ToString(); })).Count() == 0) if (!m_CurrentOnLineUsers.Keys.Contains(user)) { m_CurrentOnLineUsers.Add(user, MyEventHandler); AddUserInDGV(user); } } } catch (Exception ex) { throw ex; } }
/// <summary> /// 记录加入的客户端的用户,用于单点登录 /// </summary> /// <param name="name"></param> /// <returns></returns> void Join1(CommunicationUser user) { try { bool userAdded = false; lock (m_SyncObjForOnlyOneLoginUsers)//线程的同步性,同步访问多个线程的任何变量,利用lock(独占锁),确保数据访问的唯一性。 { //同一个用户、同一台电脑、同一个进程的重复请求不用处理 //if ((m_OnlyOneLoginUsers.Where((pair) => { return pair.Key.ToString() == user.ToString(); })).Count() > 0) return; if (m_OnlyOneLoginUsers.Keys.Contains(user)) { return; } //向已经登录的用户发送消息 //foreach (CommunicationUser key in m_OnlyOneLoginUsers.Keys) for (int i = m_OnlyOneLoginUsers.Count() - 1; i >= 0; i--) { CommunicationUser key = m_OnlyOneLoginUsers.Keys.ElementAt(i); //只能向以当前用户账号登录系统的用户发送消息 if (key.UserID == user.UserID && key.UserName == user.UserName && m_OnlyOneLoginUsers[key] != null) { //给其他用户发送需要退出系统的消息 ChatEventArgs e = new ChatEventArgs(); e.MessageType = MessageType.UserLeave; e.User = key; //循环将在线的用户广播信息 foreach (CommunicationEventHandler handler in m_OnlyOneLoginUsers[key].GetInvocationList()) { //异步方式调用多路广播委托的调用列表中的ChatEventHandler handler.BeginInvoke(this, e, null, null); } //发送完成后移除用户 m_OnlyOneLoginUsers.Remove(key); RemoveUserInDGV(key); } } //记录下当前登录的用户 //if ((m_OnlyOneLoginUsers.Where((pair) => { return pair.Key.ToString() == user.ToString(); })).Count() == 0) if (!m_OnlyOneLoginUsers.Keys.Contains(user)) { m_OnlyOneLoginUsers.Add(user, MyEventHandler); userAdded = true; AddUserInDGV(user); } } if (userAdded) { //获取当前操作客户端实例的通道给IChatCallback接口的实例callback,此通道是一个定义为IChatCallback类型的泛类型,通道的类型是事先服务契约协定好的双工机制。 m_Callback = OperationContext.Current.GetCallbackChannel <ICommunicationCallback>(); } } catch (Exception ex) { throw ex; } }