2
2
using GameFrameX . NetWork ;
3
3
using GameFrameX . NetWork . Abstractions ;
4
4
using GameFrameX . NetWork . Message ;
5
- using GameFrameX . StartUp . Abstractions ;
6
5
using GameFrameX . SuperSocket . Connection ;
7
6
using GameFrameX . SuperSocket . Primitives ;
8
7
using GameFrameX . SuperSocket . ProtoBase ;
24
23
namespace GameFrameX . StartUp ;
25
24
26
25
/// <summary>
27
- /// 程序启动器基类
26
+ /// 程序启动器基类 - 提供TCP和WebSocket服务器的基础功能实现
28
27
/// </summary>
29
- public abstract partial class AppStartUpBase : IAppStartUp
28
+ public abstract partial class AppStartUpBase
30
29
{
31
30
/// <summary>
32
- /// 消息编码处理器
31
+ /// 消息编码处理器 - 用于将消息编码成二进制格式
33
32
/// </summary>
34
33
protected IMessageEncoderHandler MessageEncoderHandler { get ; private set ; }
35
34
36
35
/// <summary>
37
- /// 消息解码处理器
36
+ /// 消息解码处理器 - 用于将二进制数据解码成消息对象
38
37
/// </summary>
39
38
protected IMessageDecoderHandler MessageDecoderHandler { get ; private set ; }
40
39
41
40
/// <summary>
42
- /// 启动服务器
41
+ /// 启动服务器 - 同时启动TCP和WebSocket服务
43
42
/// </summary>
44
43
/// <param name="messageCompressHandler">消息编码的时候使用的压缩处理器,如果为空则不处理压缩消息</param>
45
44
/// <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 ( )
49
52
{
53
+ // 先启动TCP服务器
50
54
await StartTcpServer < TMessageDecoderHandler , TMessageEncoderHandler > ( ) ;
55
+ // 再启动WebSocket服务器
51
56
await StartWebSocketServer ( ) ;
52
57
58
+ // 初始化消息处理器
53
59
if ( MessageDecoderHandler . IsNull ( ) )
54
60
{
55
61
MessageDecoderHandler = Activator . CreateInstance < TMessageDecoderHandler > ( ) ;
@@ -60,6 +66,7 @@ public abstract partial class AppStartUpBase : IAppStartUp
60
66
MessageEncoderHandler = Activator . CreateInstance < TMessageEncoderHandler > ( ) ;
61
67
}
62
68
69
+ // 设置压缩/解压处理器
63
70
if ( MessageDecoderHandler . IsNotNull ( ) )
64
71
{
65
72
MessageDecoderHandler . SetDecompressionHandler ( messageDecompressHandler ) ;
@@ -70,12 +77,13 @@ public abstract partial class AppStartUpBase : IAppStartUp
70
77
MessageEncoderHandler . SetCompressionHandler ( messageCompressHandler ) ;
71
78
}
72
79
80
+ // 设置全局启动状态
73
81
GlobalSettings . LaunchTime = DateTime . Now ;
74
82
GlobalSettings . IsAppRunning = true ;
75
83
}
76
84
77
85
/// <summary>
78
- /// 停止服务器
86
+ /// 停止服务器 - 关闭所有网络服务
79
87
/// </summary>
80
88
protected void StopServer ( )
81
89
{
@@ -85,63 +93,60 @@ protected void StopServer()
85
93
}
86
94
87
95
/// <summary>
88
- /// 消息处理异常
96
+ /// 消息处理异常处理方法
89
97
/// </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>
93
101
protected virtual ValueTask < bool > PackageErrorHandler ( IAppSession appSession , PackageHandlingException < IMessage > exception )
94
102
{
95
103
return ValueTask . FromResult ( true ) ;
96
104
}
97
105
98
106
/// <summary>
99
- /// 断开连接
107
+ /// 客户端断开连接时的处理方法
100
108
/// </summary>
101
- /// <param name="appSession"></param>
102
- /// <param name="disconnectEventArgs"></param>
103
- /// <returns></returns>
109
+ /// <param name="appSession">断开连接的会话对象</param>
110
+ /// <param name="disconnectEventArgs">断开连接的相关参数</param>
104
111
protected virtual ValueTask OnDisconnected ( IAppSession appSession , CloseEventArgs disconnectEventArgs )
105
112
{
106
- LogHelper . Info ( "有外部客户端网络断开连接成功!。断开信息:" + appSession . SessionID + " " + disconnectEventArgs . Reason ) ;
113
+ LogHelper . Info ( $ "客户端断开连接 - SessionID: { appSession . SessionID } , 断开原因: { disconnectEventArgs . Reason } " ) ;
107
114
return ValueTask . CompletedTask ;
108
115
}
109
116
110
117
/// <summary>
111
- /// 有连接连上的时候触发
118
+ /// 客户端连接成功时的处理方法
112
119
/// </summary>
113
- /// <param name="appSession"></param>
114
- /// <returns></returns>
120
+ /// <param name="appSession">新建立的会话对象</param>
115
121
protected virtual ValueTask OnConnected ( IAppSession appSession )
116
122
{
117
- LogHelper . Info ( "有外部客户端网络连接成功!。链接信息: SessionID:" + appSession . SessionID + " RemoteEndPoint:" + appSession . RemoteEndPoint ) ;
123
+ LogHelper . Info ( $ "新客户端连接 - SessionID: { appSession . SessionID } , 远程终端: { appSession . RemoteEndPoint } " ) ;
118
124
return ValueTask . CompletedTask ;
119
125
}
120
126
121
127
/// <summary>
122
- /// 有消息包收到的时候触发
128
+ /// 收到消息包的处理方法
123
129
/// </summary>
124
- /// <param name="session"></param>
125
- /// <param name="message"></param>
126
- /// <returns></returns>
130
+ /// <param name="session">会话对象</param>
131
+ /// <param name="message">接收到的消息</param>
127
132
protected virtual ValueTask PackageHandler ( IAppSession session , IMessage message )
128
133
{
129
134
if ( Setting . IsDebug && Setting . IsDebugReceive )
130
135
{
131
- LogHelper . Debug ( $ "---收到外部发给 [{ ServerType } ]的消息 { message . ToFormatMessageString ( ) } ") ;
136
+ LogHelper . Debug ( $ "收到消息 - 服务器类型: [{ ServerType } ], 消息内容: { message . ToFormatMessageString ( ) } ") ;
132
137
}
133
138
134
139
return ValueTask . CompletedTask ;
135
140
}
136
141
137
142
/// <summary>
138
- /// 消息处理
143
+ /// 异步消息处理方法
139
144
/// </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>
145
150
protected async Task InvokeMessageHandler ( IMessageHandler handler , INetworkMessage message , INetWorkChannel netWorkChannel , int timeout = 30000 , CancellationToken cancellationToken = default )
146
151
{
147
152
async void InvokeAction ( )
@@ -153,21 +158,25 @@ async void InvokeAction()
153
158
await Task . Run ( InvokeAction , cancellationToken ) ;
154
159
}
155
160
156
-
157
161
#region TCP Server
158
162
159
163
private IServer _tcpService ;
160
164
161
165
/// <summary>
162
166
/// 启动TCP服务器
163
167
/// </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 ( )
167
173
{
174
+ // 检查端口是否可用
168
175
if ( Setting . InnerPort > 0 && Net . PortIsAvailable ( Setting . InnerPort ) )
169
176
{
170
- LogHelper . InfoConsole ( $ "启动 TCP 服务器 { ServerType } 开始! address: { Setting . InnerIp } port: { Setting . InnerPort } ") ;
177
+ LogHelper . InfoConsole ( $ "启动TCP服务器 - 类型: { ServerType } , 地址: { Setting . InnerIp } , 端口: { Setting . InnerPort } ") ;
178
+
179
+ // 配置并构建TCP服务器
171
180
var hostBuilder = SuperSocketHostBuilder
172
181
. Create < IMessage , MessageObjectPipelineFilter > ( )
173
182
. ConfigureSuperSocket ( ConfigureSuperSocket )
@@ -176,14 +185,16 @@ async void InvokeAction()
176
185
. UsePackageEncoder < TMessageEncoderHandler > ( )
177
186
. UseSessionHandler ( OnConnected , OnDisconnected )
178
187
. UsePackageHandler ( PackageHandler , PackageErrorHandler )
179
- . UseInProcSessionContainer ( )
180
- ;
188
+ . UseInProcSessionContainer ( ) ;
181
189
190
+ // 配置日志
182
191
hostBuilder . ConfigureLogging ( logging =>
183
192
{
184
193
logging . ClearProviders ( ) ;
185
- logging . AddSerilog ( Serilog . Log . Logger , true ) ;
194
+ logging . AddSerilog ( Log . Logger , true ) ;
186
195
} ) ;
196
+
197
+ // 构建并启动服务器
187
198
_tcpService = hostBuilder . BuildAsServer ( ) ;
188
199
var messageEncoderHandler = ( IMessageEncoderHandler ) _tcpService . ServiceProvider . GetService < IPackageEncoder < IMessage > > ( ) ;
189
200
var messageDecoderHandler = ( IMessageDecoderHandler ) _tcpService . ServiceProvider . GetService < IPackageDecoder < IMessage > > ( ) ;
@@ -193,91 +204,97 @@ async void InvokeAction()
193
204
194
205
await _tcpService . StartAsync ( ) ;
195
206
196
- LogHelper . InfoConsole ( $ "启动 TCP 服务器 { ServerType } 端口: { Setting . InnerPort } 结束! ") ;
207
+ LogHelper . InfoConsole ( $ "TCP服务器启动完成 - 类型: { ServerType } , 端口: { Setting . InnerPort } ") ;
197
208
}
198
209
else
199
210
{
200
- LogHelper . WarnConsole ( $ "启动 TCP 服务器 { ServerType } 失败,内网端口不能小于0,且内网端口不能大于65535 或者 端口被占用,检查端口值是否正确 ") ;
211
+ LogHelper . WarnConsole ( $ "TCP服务器启动失败 - 类型: { ServerType } , 原因: 端口无效或已被占用 ") ;
201
212
}
202
213
}
203
214
204
215
/// <summary>
205
- /// 关闭TCP服务器
216
+ /// 停止TCP服务器
206
217
/// </summary>
207
218
private async void StopTcpServer ( )
208
219
{
209
- // 关闭Tcp网络服务
210
220
if ( _tcpService != null )
211
221
{
212
222
await _tcpService . StopAsync ( ) ;
223
+ _tcpService = null ;
213
224
}
214
-
215
- _tcpService = null ;
216
225
}
217
226
218
227
#endregion
219
228
220
-
221
229
#region WebSocket
222
230
223
231
/// <summary>
224
- /// WS服务器
232
+ /// WebSocket服务器实例
225
233
/// </summary>
226
234
private IHost _webSocketServer ;
227
235
228
236
/// <summary>
229
- /// 启动WebSocket
237
+ /// 启动WebSocket服务器
230
238
/// </summary>
231
239
protected async Task StartWebSocketServer ( )
232
240
{
241
+ // 检查WebSocket端口是否可用
233
242
if ( Setting . WsPort is > 0 and < ushort . MaxValue && Net . PortIsAvailable ( Setting . WsPort ) )
234
243
{
235
- LogHelper . InfoConsole ( "启动 WebSocket 服务器开始..." ) ;
244
+ LogHelper . InfoConsole ( "启动WebSocket服务器..." ) ;
245
+
246
+ // 配置并启动WebSocket服务器
236
247
_webSocketServer = WebSocketHostBuilder . Create ( )
237
248
. 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
+
239
253
await _webSocketServer . StartAsync ( ) ;
240
- LogHelper . InfoConsole ( $ "启动 WebSocket 服务器 { ServerType } 完成... 端口:{ Setting . WsPort } ") ;
254
+ LogHelper . InfoConsole ( $ "WebSocket服务器启动完成 - 类型: { ServerType } , 端口: { Setting . WsPort } ") ;
241
255
}
242
256
else
243
257
{
244
- LogHelper . WarnConsole ( $ "启动 WebSocket 服务器 { ServerType } 失败,内网端口不能小于0,内网端口不能大于65535 或者 端口被占用,检查端口值是否正确 ") ;
258
+ LogHelper . WarnConsole ( $ "WebSocket服务器启动失败 - 类型: { ServerType } , 原因: 端口无效或已被占用 ") ;
245
259
}
246
260
}
247
261
248
262
/// <summary>
249
- /// 关闭WebSocket
263
+ /// 停止WebSocket服务器
250
264
/// </summary>
251
265
private async void StopWebSocketServer ( )
252
266
{
253
- // 关闭WS网络服务
254
267
if ( _webSocketServer != null )
255
268
{
256
269
await _webSocketServer . StopAsync ( ) ;
270
+ _webSocketServer = null ;
257
271
}
258
-
259
- _webSocketServer = null ;
260
272
}
261
273
274
+ /// <summary>
275
+ /// 配置WebSocket服务器参数
276
+ /// </summary>
262
277
private void ConfigureWebServer ( HostBuilderContext context , IConfigurationBuilder builder )
263
278
{
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
+ } ;
268
285
builder . AddInMemoryCollection ( paramsDict ) ;
269
286
}
270
287
271
288
/// <summary>
272
- /// 处理收到的WS消息
289
+ /// WebSocket消息处理方法
273
290
/// </summary>
274
- /// <param name="session">连接对象 </param>
275
- /// <param name="messagePackage">消息包对象 </param>
291
+ /// <param name="session">WebSocket会话对象 </param>
292
+ /// <param name="messagePackage">接收到的消息包 </param>
276
293
private async ValueTask WebSocketMessageHandler ( WebSocketSession session , WebSocketPackage messagePackage )
277
294
{
295
+ // 只处理二进制消息
278
296
if ( messagePackage . OpCode != OpCode . Binary )
279
297
{
280
- // 不是二进制消息,直接关闭网络隧道
281
298
await session . CloseAsync ( CloseReason . ProtocolError ) ;
282
299
return ;
283
300
}
0 commit comments