Skip to content

Commit 863d989

Browse files
committed
[修改]1. 修改Session的连接处理更新的时候没有正确处理上一个连接的异常
1 parent f87c928 commit 863d989

File tree

2 files changed

+65
-45
lines changed

2 files changed

+65
-45
lines changed

GameFrameX.Apps/Common/Session/SessionManager.cs

Lines changed: 64 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,34 @@ public static class SessionManager
1414
private static readonly ConcurrentDictionary<string, Session> SessionMap = new();
1515

1616
/// <summary>
17-
/// 玩家数量
17+
/// 获取当前在线玩家的数量。
1818
/// </summary>
19-
/// <returns></returns>
19+
/// <returns>当前在线玩家的数量。</returns>
2020
public static int Count()
2121
{
2222
return SessionMap.Count;
2323
}
2424

2525
/// <summary>
26-
/// 获取分页玩家列表
26+
/// 获取分页的玩家列表。
2727
/// </summary>
28-
/// <param name="pageSize"></param>
29-
/// <param name="pageIndex"></param>
28+
/// <param name="pageSize">每页的玩家数量。</param>
29+
/// <param name="pageIndex">当前页的索引,从0开始。</param>
30+
/// <returns>指定页的玩家会话列表。</returns>
3031
public static List<Session> GetPageList(int pageSize, int pageIndex)
3132
{
32-
var result = SessionMap.Values.OrderBy(m => m.CreateTime).Where(m => ActorManager.HasActor(m.RoleId)).Skip(pageIndex * pageSize).Take(pageSize).ToList();
33+
var result = SessionMap.Values.OrderBy(m => m.CreateTime)
34+
.Where(m => ActorManager.HasActor(m.RoleId))
35+
.Skip(pageIndex * pageSize)
36+
.Take(pageSize)
37+
.ToList();
3338
return result;
3439
}
3540

3641
/// <summary>
37-
/// 踢掉玩家
42+
/// 踢掉指定角色ID的玩家,移除其会话。
3843
/// </summary>
39-
/// <param name="roleId">链接ID</param>
44+
/// <param name="roleId">要踢掉的玩家的角色ID。</param>
4045
public static void KickOffLineByUserId(long roleId)
4146
{
4247
var roleSession = Get(m => m.RoleId == roleId);
@@ -50,10 +55,11 @@ public static void KickOffLineByUserId(long roleId)
5055
}
5156

5257
/// <summary>
53-
/// 根据角色ID获取会话对象,且会话对象必须已经存在才会返回
58+
/// 根据角色ID获取对应的会话对象。
59+
/// 会话对象必须已经存在才会返回。
5460
/// </summary>
55-
/// <param name="roleId">角色ID</param>
56-
/// <returns>会话对象</returns>
61+
/// <param name="roleId">角色ID</param>
62+
/// <returns>对应的会话对象,如果不存在则返回null。</returns>
5763
public static Session GetByRoleId(long roleId)
5864
{
5965
var roleSession = Get(m => m.RoleId == roleId);
@@ -66,39 +72,41 @@ public static Session GetByRoleId(long roleId)
6672
}
6773

6874
/// <summary>
69-
/// 获取连接会话
75+
/// 根据会话ID获取连接的会话对象。
7076
/// </summary>
71-
/// <param name="sessionId">链接ID</param>
77+
/// <param name="sessionId">会话ID。</param>
78+
/// <returns>对应的会话对象,如果不存在则返回null。</returns>
7279
public static Session Get(string sessionId)
7380
{
7481
SessionMap.TryGetValue(sessionId, out var value);
7582
return value;
7683
}
7784

7885
/// <summary>
79-
/// 根据查询条件获取会话对象
86+
/// 根据指定的查询条件获取会话对象。
8087
/// </summary>
81-
/// <param name="predicate">查询条件</param>
82-
/// <returns>会话对象</returns>
88+
/// <param name="predicate">查询条件的委托。</param>
89+
/// <returns>符合条件的会话对象,如果不存在则返回null。</returns>
8390
public static Session Get(Func<Session, bool> predicate)
8491
{
8592
return SessionMap.Values.FirstOrDefault(predicate);
8693
}
8794

8895
/// <summary>
89-
/// 根据查询条件获取会话对象列表
96+
/// 根据指定的查询条件获取会话对象列表。
9097
/// </summary>
91-
/// <param name="predicate">查询条件</param>
92-
/// <returns>会话对象列表</returns>
98+
/// <param name="predicate">查询条件的委托。</param>
99+
/// <returns>符合条件的会话对象列表。</returns>
93100
public static List<Session> GetList(Func<Session, bool> predicate)
94101
{
95102
return SessionMap.Values.Where(predicate).ToList();
96103
}
97104

98105
/// <summary>
99-
/// 移除玩家
106+
/// 移除指定会话ID的玩家。
100107
/// </summary>
101-
/// <param name="sessionId">链接ID</param>
108+
/// <param name="sessionId">要移除的会话ID。</param>
109+
/// <returns>被移除的会话对象,如果不存在则返回null。</returns>
102110
public static Session Remove(string sessionId)
103111
{
104112
if (SessionMap.TryRemove(sessionId, out var value) && ActorManager.HasActor(value.RoleId))
@@ -110,9 +118,9 @@ public static Session Remove(string sessionId)
110118
}
111119

112120
/// <summary>
113-
/// 移除全部
121+
/// 移除所有在线玩家的会话。
114122
/// </summary>
115-
/// <returns></returns>
123+
/// <returns>一个表示异步操作的任务。</returns>
116124
public static Task RemoveAll()
117125
{
118126
foreach (var session in SessionMap.Values)
@@ -128,40 +136,55 @@ public static Task RemoveAll()
128136
}
129137

130138
/// <summary>
131-
/// 获取链接
139+
/// 获取指定会话ID的网络连接通道。
132140
/// </summary>
133-
/// <param name="sessionId"></param>
134-
/// <returns></returns>
141+
/// <param name="sessionId">会话ID。</param>
142+
/// <returns>对应的网络连接通道,如果不存在则返回null。</returns>
135143
public static INetWorkChannel GetChannel(string sessionId)
136144
{
137145
SessionMap.TryGetValue(sessionId, out var session);
138146
return session?.WorkChannel;
139147
}
140148

141149
/// <summary>
142-
/// 添加新连接
150+
/// 添加新的连接会话。
143151
/// </summary>
144-
/// <param name="session"></param>
152+
/// <param name="session">要添加的会话对象。</param>
145153
public static void Add(Session session)
146154
{
147-
if (SessionMap.TryGetValue(session.Id, out var oldSession) && oldSession.WorkChannel != session.WorkChannel)
155+
session.WorkChannel.SetData(GlobalConst.SessionIdKey, session.Id);
156+
SessionMap[session.Id] = session;
157+
}
158+
159+
/// <summary>
160+
/// 更新会话,处理角色ID和签名的更新。
161+
/// 如果角色ID已在其他设备上登录,则会通知旧会话并关闭其连接。
162+
/// </summary>
163+
/// <param name="sessionId">会话ID,用于标识当前会话</param>
164+
/// <param name="roleId">角色ID,表示当前会话所关联的角色</param>
165+
/// <param name="sign">签名,用于验证会话的唯一性</param>
166+
public static async void UpdateSession(string sessionId, long roleId, string sign)
167+
{
168+
// 获取与角色ID关联的旧会话
169+
var oldSession = GetByRoleId(roleId);
170+
if (oldSession != null)
148171
{
149-
if (oldSession.Sign != session.Sign)
172+
// 创建提示消息,通知用户其账号已在其他设备上登录
173+
var msg = new RespPrompt
150174
{
151-
var msg = new RespPrompt
152-
{
153-
Type = 5,
154-
Content = "你的账号已在其他设备上登陆",
155-
};
156-
oldSession.WriteAsync(msg);
157-
}
158-
159-
// 新连接 or 顶号
175+
Type = 5,
176+
Content = "你的账号已在其他设备上登陆",
177+
};
178+
// 发送消息给旧会话
179+
await oldSession.WriteAsync(msg);
180+
// 清除旧会话的连接数据并关闭连接
160181
oldSession.WorkChannel.ClearData();
161182
oldSession.WorkChannel.Close();
162183
}
163184

164-
session.WorkChannel.SetData(GlobalConst.SessionIdKey, session.Id);
165-
SessionMap[session.Id] = session;
185+
// 获取当前会话并更新角色ID和签名
186+
var session = Get(sessionId);
187+
session.SetRoleId(roleId);
188+
session.SetSign(sign);
166189
}
167190
}

GameFrameX.Hotfix/Logic/Role/Login/PlayerComponentAgent.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ public async Task OnPlayerLogin(INetWorkChannel workChannel, ReqPlayerLogin reqL
3434
}
3535

3636
// 更新连接会话数据
37-
var session = SessionManager.Get(workChannel.GameAppSession.SessionID);
38-
session.SetRoleId(playerState.Id);
39-
session.SetSign(playerState.Id.ToString());
40-
37+
SessionManager.UpdateSession(workChannel.GameAppSession.SessionID, playerState.Id,playerState.Id.ToString());
4138
var respPlayerLogin = new RespPlayerLogin
4239
{
4340
UniqueId = reqLogin.UniqueId,

0 commit comments

Comments
 (0)