Light12306/ChatRoomServer.Main/ChatServer.cs
2015-07-01 16:18:25 +08:00

99 lines
2.3 KiB
C#

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<ChatSession>
{
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<ChatSession, RoomContainer> _containers;
ConcurrentDictionary<string, RoomContainer> _roomContainers;
internal static ILog GetLogger(string name)
{
return LogManager.GetLogger("Server", name);
}
/// <summary>
/// Called when [started].
/// </summary>
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)
{
}
}
}