using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Aliyun.Api.LogService.Infrastructure.Serialization.Protobuf;
using MrWu.Debug;
using Server;
using Server.Core;
using Server.Net;
namespace Server
{
///
/// 这个管理了新旧Session
///
public class UserSessionsManager : Singleton
{
///
/// 锁对象
///
private readonly object Hashlock = new object();
///
/// 所有用户的Session
///
private readonly Dictionary AllUserSessions = new Dictionary();
///
/// 用户对应的Session
///
private readonly Dictionary> UserSession =
new Dictionary>();
public int Count
{
get
{
return _Count;
}
}
private int _Count;
///
/// 闲置池
///
private readonly ConcurrentQueue> IdlePools = new ConcurrentQueue>();
protected override void Awake()
{
GameNetDispatcher.Instance.AddListener(GameNetMsgId.SessionBindUser, OnSessionBindUser);
GameNetDispatcher.Instance.AddListener(GameNetMsgId.SessionUnBindUser, OnSessionUnBindUser);
}
protected override void Destroy()
{
GameNetDispatcher.Instance.RemoveListener(GameNetMsgId.SessionBindUser, OnSessionBindUser);
GameNetDispatcher.Instance.RemoveListener(GameNetMsgId.SessionUnBindUser, OnSessionUnBindUser);
}
private HashSet GetHash()
{
if (IdlePools.TryDequeue(out HashSet sessions))
{
return sessions;
}
return new HashSet();
}
private void Release(HashSet sessions)
{
if (sessions.Count > 0)
{
Debug.Error("还有数据怎么释放!");
return;
}
IdlePools.Enqueue(sessions);
}
private void OnSessionBindUser(object param)
{
if (param is IUserSession session)
{
Debug.Info($"绑定用户事件!!! {session.Id}");
if (session.UserData == null)
{
Debug.Error("已经绑定了,用户数据怎么会是空!");
return;
}
int userid = session.UserData.Userid;
lock (Hashlock)
{
if (!UserSession.TryGetValue(userid, out HashSet sessions))
{
sessions = GetHash();
UserSession[userid] = sessions;
}
sessions.Add(session);
AllUserSessions.Add(session.Id, session);
}
Interlocked.Increment(ref _Count);
GameDispatcher.Instance.DispatchNextFrame(GameMsgId.UserReportOnline,userid);
}
else
{
Debug.Info("Session 类型不对!");
}
}
private void OnSessionUnBindUser(object param)
{
if (param is IUserSession session)
{
if (session.UserData == null)
{
Debug.Error("解除绑定还未完成,怎么用户数据会是空的!");
return;
}
int userid = session.UserData.Userid;
lock (Hashlock)
{
if (!UserSession.TryGetValue(userid, out HashSet sessions))
{
Debug.Error("未获取到用户的Session!");
return;
}
sessions.Remove(session);
if (!AllUserSessions.Remove(session.Id))
{
Debug.Error("怎么会未移除!!!!!");
}
if (sessions.Count == 0)
{
UserSession.Remove(userid);
Release(sessions);
}
}
Interlocked.Decrement(ref _Count);
GameDispatcher.Instance.DispatchNextFrame(GameMsgId.UserReportOffline,userid);
}
}
public HashSet GetUserSession(int userid)
{
HashSet result = null;
lock (Hashlock)
{
if (UserSession.TryGetValue(userid, out HashSet sessions))
{
result = new HashSet(sessions);
}
}
return result;
}
public IUserSession[] GetSessions()
{
lock (Hashlock)
{
return AllUserSessions.Values.ToArray();
}
}
}
}