Skip to content

Commit d0c5167

Browse files
committed
[增加]1. 增加服务器启动类的注释
1 parent b2b201c commit d0c5167

File tree

1 file changed

+84
-67
lines changed

1 file changed

+84
-67
lines changed

GameFrameX.StartUp/AppStartUpByServer.cs

Lines changed: 84 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using GameFrameX.NetWork;
33
using GameFrameX.NetWork.Abstractions;
44
using GameFrameX.NetWork.Message;
5-
using GameFrameX.StartUp.Abstractions;
65
using GameFrameX.SuperSocket.Connection;
76
using GameFrameX.SuperSocket.Primitives;
87
using GameFrameX.SuperSocket.ProtoBase;
@@ -24,32 +23,39 @@
2423
namespace GameFrameX.StartUp;
2524

2625
/// <summary>
27-
/// 程序启动器基类
26+
/// 程序启动器基类 - 提供TCP和WebSocket服务器的基础功能实现
2827
/// </summary>
29-
public abstract partial class AppStartUpBase : IAppStartUp
28+
public abstract partial class AppStartUpBase
3029
{
3130
/// <summary>
32-
/// 消息编码处理器
31+
/// 消息编码处理器 - 用于将消息编码成二进制格式
3332
/// </summary>
3433
protected IMessageEncoderHandler MessageEncoderHandler { get; private set; }
3534

3635
/// <summary>
37-
/// 消息解码处理器
36+
/// 消息解码处理器 - 用于将二进制数据解码成消息对象
3837
/// </summary>
3938
protected IMessageDecoderHandler MessageDecoderHandler { get; private set; }
4039

4140
/// <summary>
42-
/// 启动服务器
41+
/// 启动服务器 - 同时启动TCP和WebSocket服务
4342
/// </summary>
4443
/// <param name="messageCompressHandler">消息编码的时候使用的压缩处理器,如果为空则不处理压缩消息</param>
4544
/// <param name="messageDecompressHandler">消息解码的时候使用的解压处理器,如果为空则不处理压缩消息</param>
46-
/// <typeparam name="TMessageDecoderHandler">消息解码处理器类型</typeparam>
47-
/// <typeparam name="TMessageEncoderHandler">消息编码处理器类型</typeparam>
48-
protected async Task StartServerAsync<TMessageDecoderHandler, TMessageEncoderHandler>(IMessageCompressHandler messageCompressHandler = null, IMessageDecompressHandler messageDecompressHandler = null) where TMessageDecoderHandler : class, IMessageDecoderHandler, IPackageDecoder<IMessage>, new() where TMessageEncoderHandler : class, IMessageEncoderHandler, IPackageEncoder<IMessage>, new()
45+
/// <typeparam name="TMessageDecoderHandler">消息解码处理器类型,必须实现IMessageDecoderHandler和IPackageDecoder接口</typeparam>
46+
/// <typeparam name="TMessageEncoderHandler">消息编码处理器类型,必须实现IMessageEncoderHandler和IPackageEncoder接口</typeparam>
47+
protected async Task StartServerAsync<TMessageDecoderHandler, TMessageEncoderHandler>(
48+
IMessageCompressHandler messageCompressHandler = null,
49+
IMessageDecompressHandler messageDecompressHandler = null)
50+
where TMessageDecoderHandler : class, IMessageDecoderHandler, IPackageDecoder<IMessage>, new()
51+
where TMessageEncoderHandler : class, IMessageEncoderHandler, IPackageEncoder<IMessage>, new()
4952
{
53+
// 先启动TCP服务器
5054
await StartTcpServer<TMessageDecoderHandler, TMessageEncoderHandler>();
55+
// 再启动WebSocket服务器
5156
await StartWebSocketServer();
5257

58+
// 初始化消息处理器
5359
if (MessageDecoderHandler.IsNull())
5460
{
5561
MessageDecoderHandler = Activator.CreateInstance<TMessageDecoderHandler>();
@@ -60,6 +66,7 @@ public abstract partial class AppStartUpBase : IAppStartUp
6066
MessageEncoderHandler = Activator.CreateInstance<TMessageEncoderHandler>();
6167
}
6268

69+
// 设置压缩/解压处理器
6370
if (MessageDecoderHandler.IsNotNull())
6471
{
6572
MessageDecoderHandler.SetDecompressionHandler(messageDecompressHandler);
@@ -70,12 +77,13 @@ public abstract partial class AppStartUpBase : IAppStartUp
7077
MessageEncoderHandler.SetCompressionHandler(messageCompressHandler);
7178
}
7279

80+
// 设置全局启动状态
7381
GlobalSettings.LaunchTime = DateTime.Now;
7482
GlobalSettings.IsAppRunning = true;
7583
}
7684

7785
/// <summary>
78-
/// 停止服务器
86+
/// 停止服务器 - 关闭所有网络服务
7987
/// </summary>
8088
protected void StopServer()
8189
{
@@ -85,63 +93,60 @@ protected void StopServer()
8593
}
8694

8795
/// <summary>
88-
/// 消息处理异常
96+
/// 消息处理异常处理方法
8997
/// </summary>
90-
/// <param name="appSession"></param>
91-
/// <param name="exception"></param>
92-
/// <returns></returns>
98+
/// <param name="appSession">会话对象</param>
99+
/// <param name="exception">异常信息</param>
100+
/// <returns>返回true表示继续处理,返回false表示终止处理</returns>
93101
protected virtual ValueTask<bool> PackageErrorHandler(IAppSession appSession, PackageHandlingException<IMessage> exception)
94102
{
95103
return ValueTask.FromResult(true);
96104
}
97105

98106
/// <summary>
99-
/// 断开连接
107+
/// 客户端断开连接时的处理方法
100108
/// </summary>
101-
/// <param name="appSession"></param>
102-
/// <param name="disconnectEventArgs"></param>
103-
/// <returns></returns>
109+
/// <param name="appSession">断开连接的会话对象</param>
110+
/// <param name="disconnectEventArgs">断开连接的相关参数</param>
104111
protected virtual ValueTask OnDisconnected(IAppSession appSession, CloseEventArgs disconnectEventArgs)
105112
{
106-
LogHelper.Info("有外部客户端网络断开连接成功!。断开信息:" + appSession.SessionID + " " + disconnectEventArgs.Reason);
113+
LogHelper.Info($"客户端断开连接 - SessionID: {appSession.SessionID}, 断开原因: {disconnectEventArgs.Reason}");
107114
return ValueTask.CompletedTask;
108115
}
109116

110117
/// <summary>
111-
/// 有连接连上的时候触发
118+
/// 客户端连接成功时的处理方法
112119
/// </summary>
113-
/// <param name="appSession"></param>
114-
/// <returns></returns>
120+
/// <param name="appSession">新建立的会话对象</param>
115121
protected virtual ValueTask OnConnected(IAppSession appSession)
116122
{
117-
LogHelper.Info("有外部客户端网络连接成功!。链接信息:SessionID:" + appSession.SessionID + " RemoteEndPoint:" + appSession.RemoteEndPoint);
123+
LogHelper.Info($"新客户端连接 - SessionID: {appSession.SessionID}, 远程终端: {appSession.RemoteEndPoint}");
118124
return ValueTask.CompletedTask;
119125
}
120126

121127
/// <summary>
122-
/// 有消息包收到的时候触发
128+
/// 收到消息包的处理方法
123129
/// </summary>
124-
/// <param name="session"></param>
125-
/// <param name="message"></param>
126-
/// <returns></returns>
130+
/// <param name="session">会话对象</param>
131+
/// <param name="message">接收到的消息</param>
127132
protected virtual ValueTask PackageHandler(IAppSession session, IMessage message)
128133
{
129134
if (Setting.IsDebug && Setting.IsDebugReceive)
130135
{
131-
LogHelper.Debug($"---收到外部发给[{ServerType}]的消息 {message.ToFormatMessageString()}");
136+
LogHelper.Debug($"收到消息 - 服务器类型: [{ServerType}], 消息内容: {message.ToFormatMessageString()}");
132137
}
133138

134139
return ValueTask.CompletedTask;
135140
}
136141

137142
/// <summary>
138-
/// 消息处理
143+
/// 异步消息处理方法
139144
/// </summary>
140-
/// <param name="handler"></param>
141-
/// <param name="message"></param>
142-
/// <param name="netWorkChannel"></param>
143-
/// <param name="timeout">处理超时时间</param>
144-
/// <param name="cancellationToken">用于取消的令牌</param>
145+
/// <param name="handler">消息处理器</param>
146+
/// <param name="message">网络消息</param>
147+
/// <param name="netWorkChannel">网络通道</param>
148+
/// <param name="timeout">超时时间(毫秒)</param>
149+
/// <param name="cancellationToken">取消令牌</param>
145150
protected async Task InvokeMessageHandler(IMessageHandler handler, INetworkMessage message, INetWorkChannel netWorkChannel, int timeout = 30000, CancellationToken cancellationToken = default)
146151
{
147152
async void InvokeAction()
@@ -153,21 +158,25 @@ async void InvokeAction()
153158
await Task.Run(InvokeAction, cancellationToken);
154159
}
155160

156-
157161
#region TCP Server
158162

159163
private IServer _tcpService;
160164

161165
/// <summary>
162166
/// 启动TCP服务器
163167
/// </summary>
164-
/// <typeparam name="TMessageDecoderHandler"></typeparam>
165-
/// <typeparam name="TMessageEncoderHandler"></typeparam>
166-
private async Task StartTcpServer<TMessageDecoderHandler, TMessageEncoderHandler>() where TMessageDecoderHandler : class, IMessageDecoderHandler, IPackageDecoder<IMessage>, new() where TMessageEncoderHandler : class, IMessageEncoderHandler, IPackageEncoder<IMessage>, new()
168+
/// <typeparam name="TMessageDecoderHandler">消息解码处理器类型</typeparam>
169+
/// <typeparam name="TMessageEncoderHandler">消息编码处理器类型</typeparam>
170+
private async Task StartTcpServer<TMessageDecoderHandler, TMessageEncoderHandler>()
171+
where TMessageDecoderHandler : class, IMessageDecoderHandler, IPackageDecoder<IMessage>, new()
172+
where TMessageEncoderHandler : class, IMessageEncoderHandler, IPackageEncoder<IMessage>, new()
167173
{
174+
// 检查端口是否可用
168175
if (Setting.InnerPort > 0 && Net.PortIsAvailable(Setting.InnerPort))
169176
{
170-
LogHelper.InfoConsole($"启动 TCP 服务器 {ServerType} 开始! address: {Setting.InnerIp} port: {Setting.InnerPort}");
177+
LogHelper.InfoConsole($"启动TCP服务器 - 类型: {ServerType}, 地址: {Setting.InnerIp}, 端口: {Setting.InnerPort}");
178+
179+
// 配置并构建TCP服务器
171180
var hostBuilder = SuperSocketHostBuilder
172181
.Create<IMessage, MessageObjectPipelineFilter>()
173182
.ConfigureSuperSocket(ConfigureSuperSocket)
@@ -176,14 +185,16 @@ async void InvokeAction()
176185
.UsePackageEncoder<TMessageEncoderHandler>()
177186
.UseSessionHandler(OnConnected, OnDisconnected)
178187
.UsePackageHandler(PackageHandler, PackageErrorHandler)
179-
.UseInProcSessionContainer()
180-
;
188+
.UseInProcSessionContainer();
181189

190+
// 配置日志
182191
hostBuilder.ConfigureLogging(logging =>
183192
{
184193
logging.ClearProviders();
185-
logging.AddSerilog(Serilog.Log.Logger, true);
194+
logging.AddSerilog(Log.Logger, true);
186195
});
196+
197+
// 构建并启动服务器
187198
_tcpService = hostBuilder.BuildAsServer();
188199
var messageEncoderHandler = (IMessageEncoderHandler)_tcpService.ServiceProvider.GetService<IPackageEncoder<IMessage>>();
189200
var messageDecoderHandler = (IMessageDecoderHandler)_tcpService.ServiceProvider.GetService<IPackageDecoder<IMessage>>();
@@ -193,91 +204,97 @@ async void InvokeAction()
193204

194205
await _tcpService.StartAsync();
195206

196-
LogHelper.InfoConsole($"启动 TCP 服务器 {ServerType} 端口: {Setting.InnerPort} 结束!");
207+
LogHelper.InfoConsole($"TCP服务器启动完成 - 类型: {ServerType}, 端口: {Setting.InnerPort}");
197208
}
198209
else
199210
{
200-
LogHelper.WarnConsole($"启动 TCP 服务器 {ServerType} 失败,内网端口不能小于0,且内网端口不能大于65535 或者 端口被占用,检查端口值是否正确");
211+
LogHelper.WarnConsole($"TCP服务器启动失败 - 类型: {ServerType}, 原因: 端口无效或已被占用");
201212
}
202213
}
203214

204215
/// <summary>
205-
/// 关闭TCP服务器
216+
/// 停止TCP服务器
206217
/// </summary>
207218
private async void StopTcpServer()
208219
{
209-
// 关闭Tcp网络服务
210220
if (_tcpService != null)
211221
{
212222
await _tcpService.StopAsync();
223+
_tcpService = null;
213224
}
214-
215-
_tcpService = null;
216225
}
217226

218227
#endregion
219228

220-
221229
#region WebSocket
222230

223231
/// <summary>
224-
/// WS服务器
232+
/// WebSocket服务器实例
225233
/// </summary>
226234
private IHost _webSocketServer;
227235

228236
/// <summary>
229-
/// 启动WebSocket
237+
/// 启动WebSocket服务器
230238
/// </summary>
231239
protected async Task StartWebSocketServer()
232240
{
241+
// 检查WebSocket端口是否可用
233242
if (Setting.WsPort is > 0 and < ushort.MaxValue && Net.PortIsAvailable(Setting.WsPort))
234243
{
235-
LogHelper.InfoConsole("启动 WebSocket 服务器开始...");
244+
LogHelper.InfoConsole("启动WebSocket服务器...");
245+
246+
// 配置并启动WebSocket服务器
236247
_webSocketServer = WebSocketHostBuilder.Create()
237248
.UseWebSocketMessageHandler(WebSocketMessageHandler)
238-
.UseSessionHandler(OnConnected, OnDisconnected).ConfigureAppConfiguration((Action<HostBuilderContext, IConfigurationBuilder>)ConfigureWebServer).Build();
249+
.UseSessionHandler(OnConnected, OnDisconnected)
250+
.ConfigureAppConfiguration((Action<HostBuilderContext, IConfigurationBuilder>)ConfigureWebServer)
251+
.Build();
252+
239253
await _webSocketServer.StartAsync();
240-
LogHelper.InfoConsole($"启动 WebSocket 服务器 {ServerType} 完成...端口:{Setting.WsPort}");
254+
LogHelper.InfoConsole($"WebSocket服务器启动完成 - 类型: {ServerType}, 端口: {Setting.WsPort}");
241255
}
242256
else
243257
{
244-
LogHelper.WarnConsole($"启动 WebSocket 服务器 {ServerType} 失败,内网端口不能小于0,内网端口不能大于65535 或者 端口被占用,检查端口值是否正确");
258+
LogHelper.WarnConsole($"WebSocket服务器启动失败 - 类型: {ServerType}, 原因: 端口无效或已被占用");
245259
}
246260
}
247261

248262
/// <summary>
249-
/// 关闭WebSocket
263+
/// 停止WebSocket服务器
250264
/// </summary>
251265
private async void StopWebSocketServer()
252266
{
253-
// 关闭WS网络服务
254267
if (_webSocketServer != null)
255268
{
256269
await _webSocketServer.StopAsync();
270+
_webSocketServer = null;
257271
}
258-
259-
_webSocketServer = null;
260272
}
261273

274+
/// <summary>
275+
/// 配置WebSocket服务器参数
276+
/// </summary>
262277
private void ConfigureWebServer(HostBuilderContext context, IConfigurationBuilder builder)
263278
{
264-
var paramsDict = new Dictionary<string, string>();
265-
paramsDict.Add("serverOptions:listeners:0:port", Setting.WsPort.ToString());
266-
paramsDict.Add("serverOptions:listeners:0:ip", Setting.InnerIp.IsNullOrWhiteSpace() ? "Any" : Setting.InnerIp);
267-
paramsDict.Add("serverOptions:name", Setting.ServerName);
279+
var paramsDict = new Dictionary<string, string>
280+
{
281+
["serverOptions:listeners:0:port"] = Setting.WsPort.ToString(),
282+
["serverOptions:listeners:0:ip"] = Setting.InnerIp.IsNullOrWhiteSpace() ? "Any" : Setting.InnerIp,
283+
["serverOptions:name"] = Setting.ServerName
284+
};
268285
builder.AddInMemoryCollection(paramsDict);
269286
}
270287

271288
/// <summary>
272-
/// 处理收到的WS消息
289+
/// WebSocket消息处理方法
273290
/// </summary>
274-
/// <param name="session">连接对象</param>
275-
/// <param name="messagePackage">消息包对象</param>
291+
/// <param name="session">WebSocket会话对象</param>
292+
/// <param name="messagePackage">接收到的消息包</param>
276293
private async ValueTask WebSocketMessageHandler(WebSocketSession session, WebSocketPackage messagePackage)
277294
{
295+
// 只处理二进制消息
278296
if (messagePackage.OpCode != OpCode.Binary)
279297
{
280-
// 不是二进制消息,直接关闭网络隧道
281298
await session.CloseAsync(CloseReason.ProtocolError);
282299
return;
283300
}

0 commit comments

Comments
 (0)