22using GameFrameX . NetWork ;
33using GameFrameX . NetWork . Abstractions ;
44using GameFrameX . NetWork . Message ;
5- using GameFrameX . StartUp . Abstractions ;
65using GameFrameX . SuperSocket . Connection ;
76using GameFrameX . SuperSocket . Primitives ;
87using GameFrameX . SuperSocket . ProtoBase ;
2423namespace 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