99 lines
2.3 KiB
C#
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)
|
|
{
|
|
|
|
|
|
}
|
|
}
|
|
}
|