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(); /// /// 获得或设置房间ID /// public string Id { get; private set; } public RoomContainer(string id) { Id = id; } public void Add(ChatSession session) { var ctx = _contexts.GetOrAdd(session, new RoomSessionContext()); 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; } 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 Remove(ChatSession session) { RoomSessionContext context; _contexts.TryRemove(session, out context); 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; } /// /// 获得会话数 /// public int SessionCount => _contexts.Count; } }