using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ChatRoomServer.Main { using System.Collections.Concurrent; using ChatRoomServer.Main.Room; using FSLib.Logs.Log4Net; using FSLib.Network.SuperSocket.Protocols.WebSocket; using FSLib.Network.SuperSocket.SocketBase; class ChatServer : WebSocketServer { static ILog _log; static readonly object _lockObject = new object(); static ChatServer() { FSLib.Logs.Log4NetBootStraper.Initialize("log4net.server.config", "Server"); _log = GetLogger(typeof(ChatServer).Name); } ConcurrentDictionary _containers; ConcurrentDictionary _roomContainers; internal static ILog GetLogger(string name) { return LogManager.GetLogger("Server", name); } /// /// Called when [started]. /// protected override void OnStarted() { base.OnStarted(); NewDataReceived += ChatServer_NewDataReceived; NewSessionConnected += ChatServer_NewSessionConnected; NewMessageReceived += ChatServer_NewMessageReceived; NewRequestReceived += ChatServer_NewRequestReceived; SessionClosed += ChatServer_SessionClosed; } private void ChatServer_SessionClosed(ChatSession session, CloseReason value) { RoomContainer roomContainer; if (_containers.TryRemove(session, out roomContainer)) { roomContainer.Remove(session); if (roomContainer.SessionCount == 0) { _roomContainers.TryRemove(roomContainer.Id, out roomContainer); } } } private void ChatServer_NewRequestReceived(ChatSession session, FSLib.Network.SuperSocket.Protocols.WebSocket.Protocol.IWebSocketFragment requestInfo) { } private void ChatServer_NewMessageReceived(ChatSession session, string value) { } private void ChatServer_NewSessionConnected(ChatSession session) { var cmd = session.Command; if (cmd == "room") { var roomid = session.Id; //TODO check roomid var roomCtx = _roomContainers.GetOrAdd(roomid, _ => new RoomContainer(_)); _containers.AddOrUpdate(session, roomCtx); roomCtx.Add(session); } else { session.Close(CloseReason.ProtocolError); } } private void ChatServer_NewDataReceived(ChatSession session, byte[] value) { } } }