using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ChatRoomServer.Main.Room { using System.Collections.Concurrent; using ChatRoomServer.Main.Entities; class RoomContainer { ConcurrentDictionary _contexts = new ConcurrentDictionary(); ConcurrentDictionary> _users = new ConcurrentDictionary>(); public RoomContainer(string id) { Id = id; } private void Session_RequireSendMessage(object sender, RequireSendMessageEventArgs e) { var enumerator = _contexts.GetEnumerator(); while (enumerator.MoveNext()) { if (!e.ExcludeSender || sender != enumerator.Current.Key) enumerator.Current.Key.TrySend(e.MessageItem); } } public void Add(ChatSession session) { var ctx = _contexts.GetOrAdd(session, new RoomSessionContext()); var list = _users.GetOrAdd(session.UserName, _ => new HashSet()); list.Add(session); session.RoomContainer = this; var count = _contexts.Count; var enumerator = _contexts.GetEnumerator(); var data = count + "\t" + session.UserName + "\t" + session.NickName; var msg = new MessageItem(SystemMessageType.UserEnter, content: data); while (enumerator.MoveNext()) { if (enumerator.Current.Key != session) enumerator.Current.Key.TrySend(msg); } session.TrySend(msg); //add event listener session.RequireSendMessage += Session_RequireSendMessage; } /// /// 判断指定的用户是否在线 /// /// /// public bool IsUserInRoom(string user) { return _users.ContainsKey(user); } public void Remove(ChatSession session) { RoomSessionContext context; if (!_contexts.TryRemove(session, out context)) return; HashSet sessions; if (_users.TryGetValue(session.UserName, out sessions)) { lock (sessions) { if (sessions.Contains(session)) sessions.Remove(session); if (sessions.Count == 0) _users.TryRemove(session.UserName, out sessions); } } var count = _contexts.Count; var enumerator = _contexts.GetEnumerator(); var data = count + "\t" + session.UserName + "\t" + session.NickName; var msg = new MessageItem(SystemMessageType.UserExit, content: data); while (enumerator.MoveNext()) { enumerator.Current.Key.TrySend(msg); } //remove event listener session.RequireSendMessage -= Session_RequireSendMessage; } /// /// 获得或设置房间ID /// public string Id { get; private set; } /// /// 获得会话数 /// public int SessionCount => _contexts.Count; } }