Skip to content

Commit 0c48b8a

Browse files
committed
feat(RpcSession): 扩展RPC会话功能并重构数据管理
- 新增IRpcSessionData接口定义RPC会话数据规范 - 重命名RpcData为RpcSessionData并实现接口 - 为Call方法添加泛型支持 - 新增Stop、Tick等会话管理方法 - 优化回复消息处理流程
1 parent 9496db5 commit 0c48b8a

File tree

4 files changed

+121
-25
lines changed

4 files changed

+121
-25
lines changed

GameFrameX.NetWork.Abstractions/IRpcSession.cs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,36 @@ public interface IRpcSession
4242
/// <param name="message">调用消息对象</param>
4343
/// <param name="timeOutMillisecond">调用超时,单位毫秒,默认10秒</param>
4444
/// <returns>返回消息对象</returns>
45-
Task<IRpcResult> Call(IRequestMessage message, int timeOutMillisecond = 10000);
45+
/// <typeparam name="T">返回消息对象类型</typeparam>
46+
Task<IRpcResult> Call<T>(IRequestMessage message, int timeOutMillisecond = 10000) where T : IResponseMessage, new();
4647

4748
/// <summary>
4849
/// 异步发送,不等待结果
4950
/// </summary>
5051
/// <param name="message">调用消息对象</param>
5152
void Send(IRequestMessage message);
53+
54+
/// <summary>
55+
/// 处理消息队列
56+
/// </summary>
57+
/// <returns>处理结果</returns>
58+
IRpcSessionData Handler();
59+
60+
/// <summary>
61+
/// 回复消息
62+
/// </summary>
63+
/// <param name="message">回复消息对象</param>
64+
/// <returns>是否成功回复</returns>
65+
bool Reply(IResponseMessage message);
66+
67+
/// <summary>
68+
/// 处理消息队列
69+
/// </summary>
70+
/// <param name="elapseMillisecondsTime">时间间隔,单位毫秒</param>
71+
void Tick(int elapseMillisecondsTime);
72+
73+
/// <summary>
74+
/// 停止会话
75+
/// </summary>
76+
void Stop();
5277
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// ==========================================================================================
2+
// GameFrameX 组织及其衍生项目的版权、商标、专利及其他相关权利
3+
// GameFrameX organization and its derivative projects' copyrights, trademarks, patents, and related rights
4+
// 均受中华人民共和国及相关国际法律法规保护。
5+
// are protected by the laws of the People's Republic of China and relevant international regulations.
6+
//
7+
// 使用本项目须严格遵守相应法律法规及开源许可证之规定。
8+
// Usage of this project must strictly comply with applicable laws, regulations, and open-source licenses.
9+
//
10+
// 本项目采用 MIT 许可证与 Apache License 2.0 双许可证分发,
11+
// This project is dual-licensed under the MIT License and Apache License 2.0,
12+
// 完整许可证文本请参见源代码根目录下的 LICENSE 文件。
13+
// please refer to the LICENSE file in the root directory of the source code for the full license text.
14+
//
15+
// 禁止利用本项目实施任何危害国家安全、破坏社会秩序、
16+
// It is prohibited to use this project to engage in any activities that endanger national security, disrupt social order,
17+
// 侵犯他人合法权益等法律法规所禁止的行为!
18+
// or infringe upon the legitimate rights and interests of others, as prohibited by laws and regulations!
19+
// 因基于本项目二次开发所产生的一切法律纠纷与责任,
20+
// Any legal disputes and liabilities arising from secondary development based on this project
21+
// 本项目组织与贡献者概不承担。
22+
// shall be borne solely by the developer; the project organization and contributors assume no responsibility.
23+
//
24+
// GitHub 仓库:https://github.com/GameFrameX
25+
// GitHub Repository: https://github.com/GameFrameX
26+
// Gitee 仓库:https://gitee.com/GameFrameX
27+
// Gitee Repository: https://gitee.com/GameFrameX
28+
// 官方文档:https://gameframex.doc.alianblank.com/
29+
// Official Documentation: https://gameframex.doc.alianblank.com/
30+
// ==========================================================================================
31+
32+
namespace GameFrameX.NetWork.Abstractions;
33+
34+
/// <summary>
35+
/// RPC会话数据接口
36+
/// </summary>
37+
public interface IRpcSessionData
38+
{
39+
/// <summary>
40+
/// 任务
41+
/// </summary>
42+
Task<IRpcResult> Task { get; }
43+
44+
/// <summary>
45+
/// 是否回复消息
46+
/// </summary>
47+
bool IsReply { get; }
48+
49+
/// <summary>
50+
/// 唯一ID,用于标识RPC会话
51+
/// </summary>
52+
long UniqueId { get; }
53+
54+
/// <summary>
55+
/// 请求消息
56+
/// </summary>
57+
INetworkMessage RequestMessage { get; }
58+
59+
/// <summary>
60+
/// 回复消息
61+
/// </summary>
62+
/// <param name="message">回复消息对象</param>
63+
/// <returns>是否成功回复</returns>
64+
bool Reply(IResponseMessage message);
65+
66+
/// <summary>
67+
/// 增加时间。如果超时返回true
68+
/// </summary>
69+
/// <param name="millisecondsTime">流逝时间.单位毫秒</param>
70+
/// <returns>是否超时</returns>
71+
bool IncrementalElapseTime(long millisecondsTime);
72+
}

GameFrameX.NetWork/RpcSession.RpcData.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ namespace GameFrameX.NetWork;
3838
/// <summary>
3939
/// RPC 数据
4040
/// </summary>
41-
public sealed class RpcData : IDisposable
41+
public sealed class RpcSessionData : IRpcSessionData, IDisposable
4242
{
4343
private readonly TaskCompletionSource<IRpcResult> _tcs;
4444

@@ -48,7 +48,7 @@ public sealed class RpcData : IDisposable
4848
/// <param name="requestMessage">请求消息</param>
4949
/// <param name="isReply">是否需要回复</param>
5050
/// <param name="timeout">超时时间,单位毫秒,默认10秒</param>
51-
private RpcData(IRequestMessage requestMessage, bool isReply = true, int timeout = 10000)
51+
private RpcSessionData(IRequestMessage requestMessage, bool isReply = true, int timeout = 10000)
5252
{
5353
CreatedTime = TimerHelper.UnixTimeMilliseconds();
5454
RequestMessage = requestMessage;
@@ -89,12 +89,12 @@ public long UniqueId
8989
/// <summary>
9090
/// 请求消息
9191
/// </summary>
92-
public IRequestMessage RequestMessage { get; private set; }
92+
public INetworkMessage RequestMessage { get; private set; }
9393

9494
/// <summary>
9595
/// 响应消息
9696
/// </summary>
97-
public IResponseMessage ResponseMessage { get; private set; }
97+
public INetworkMessage ResponseMessage { get; private set; }
9898

9999
/// <summary>
100100
/// RPC 耗时时间.单位毫秒
@@ -126,12 +126,13 @@ public void Dispose()
126126
/// RPC 回复
127127
/// </summary>
128128
/// <param name="responseMessage"></param>
129-
public void Reply(IResponseMessage responseMessage)
129+
public bool Reply(IResponseMessage responseMessage)
130130
{
131131
ResponseMessage = responseMessage;
132132
Time = TimerHelper.UnixTimeMilliseconds() - CreatedTime;
133133
var result = new RpcResult(responseMessage);
134134
_tcs.SetResult(result);
135+
return true;
135136
}
136137

137138
/// <summary>
@@ -141,9 +142,9 @@ public void Reply(IResponseMessage responseMessage)
141142
/// <param name="isReply">是否需要回复</param>
142143
/// <param name="timeout">超时时间,单位毫秒</param>
143144
/// <returns></returns>
144-
public static RpcData Create(IRequestMessage requestMessage, bool isReply = true, int timeout = 10000)
145+
public static IRpcSessionData Create(IRequestMessage requestMessage, bool isReply = true, int timeout = 10000)
145146
{
146-
var rpcData = new RpcData(requestMessage, isReply, timeout);
147+
var rpcData = new RpcSessionData(requestMessage, isReply, timeout);
147148
return rpcData;
148149
}
149150

@@ -152,7 +153,7 @@ public static RpcData Create(IRequestMessage requestMessage, bool isReply = true
152153
/// </summary>
153154
/// <param name="millisecondsTime">流逝时间.单位毫秒</param>
154155
/// <returns></returns>
155-
internal bool IncrementalElapseTime(long millisecondsTime)
156+
public bool IncrementalElapseTime(long millisecondsTime)
156157
{
157158
ElapseTime += millisecondsTime;
158159
if (ElapseTime >= Timeout)
@@ -168,7 +169,7 @@ internal bool IncrementalElapseTime(long millisecondsTime)
168169
/// <summary>
169170
/// 析构函数
170171
/// </summary>
171-
~RpcData()
172+
~RpcSessionData()
172173
{
173174
Dispose();
174175
}

GameFrameX.NetWork/RpcSession.cs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
// ==========================================================================================
3131

3232

33-
3433
using System.Collections.Concurrent;
3534
using GameFrameX.NetWork.Abstractions;
3635

@@ -49,12 +48,12 @@ public sealed class RpcSession : IRpcSession, IDisposable
4948
/// <summary>
5049
/// RPC处理队列
5150
/// </summary>
52-
private readonly ConcurrentDictionary<long, RpcData> _rpcHandlingObjects = new();
51+
private readonly ConcurrentDictionary<long, IRpcSessionData> _rpcHandlingObjects = new();
5352

5453
/// <summary>
5554
/// 等待队列
5655
/// </summary>
57-
private readonly ConcurrentQueue<RpcData> _waitingObjects = new();
56+
private readonly ConcurrentQueue<IRpcSessionData> _waitingObjects = new();
5857

5958
/// <summary>
6059
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
@@ -72,9 +71,9 @@ public void Dispose()
7271
/// <param name="message">调用消息对象</param>
7372
/// <param name="timeOutMillisecond">调用超时,单位毫秒,默认10秒</param>
7473
/// <returns>返回消息对象</returns>
75-
public Task<IRpcResult> Call(IRequestMessage message, int timeOutMillisecond = 10000)
74+
public Task<IRpcResult> Call<T>(IRequestMessage message, int timeOutMillisecond = 10000) where T : IResponseMessage, new()
7675
{
77-
var rpcData = RpcData.Create(message, true, timeOutMillisecond);
76+
var rpcData = RpcSessionData.Create(message, true, timeOutMillisecond);
7877
_waitingObjects.Enqueue(rpcData);
7978
return rpcData.Task;
8079
}
@@ -85,15 +84,15 @@ public Task<IRpcResult> Call(IRequestMessage message, int timeOutMillisecond = 1
8584
/// <param name="message">调用消息对象</param>
8685
public void Send(IRequestMessage message)
8786
{
88-
var actorObject = RpcData.Create(message, false);
87+
var actorObject = RpcSessionData.Create(message, false);
8988
_waitingObjects.Enqueue(actorObject);
9089
}
9190

9291
/// <summary>
9392
/// 处理消息队列
9493
/// </summary>
95-
/// <returns></returns>
96-
public RpcData TryPeek()
94+
/// <returns>等待处理的消息对象</returns>
95+
public IRpcSessionData TryPeek()
9796
{
9897
if (_waitingObjects.TryPeek(out var message))
9998
{
@@ -106,8 +105,8 @@ public RpcData TryPeek()
106105
/// <summary>
107106
/// 处理消息队列
108107
/// </summary>
109-
/// <returns></returns>
110-
public RpcData Handler()
108+
/// <returns>处理的消息对象</returns>
109+
public IRpcSessionData Handler()
111110
{
112111
if (_waitingObjects.TryDequeue(out var message))
113112
{
@@ -123,16 +122,15 @@ public RpcData Handler()
123122
}
124123

125124
/// <summary>
126-
/// 回复
125+
/// 回复消息
127126
/// </summary>
128-
/// <param name="message"></param>
129-
/// <returns></returns>
127+
/// <param name="message">回复消息对象</param>
128+
/// <returns>是否成功回复</returns>
130129
public bool Reply(IResponseMessage message)
131130
{
132131
if (_rpcHandlingObjects.TryRemove(message.UniqueId, out var rpcData))
133132
{
134-
rpcData.Reply(message);
135-
return true;
133+
return rpcData.Reply(message);
136134
}
137135

138136
return false;

0 commit comments

Comments
 (0)