Skip to content

Commit 08d8d8d

Browse files
committed
[修改]1. 尝试解决进程合并的监听消息问题
1 parent 85f570d commit 08d8d8d

2 files changed

Lines changed: 126 additions & 120 deletions

File tree

GameFrameX.StartUp/AppStartUpBase.cs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,6 @@ public abstract partial class AppStartUpBase : IAppStartUp
1818
/// </summary>
1919
protected readonly TaskCompletionSource<string> AppExitSource = new();
2020

21-
/// <summary>
22-
/// 监听配置
23-
/// 当InnerIp为空时.将使用Any
24-
/// 当InnerPort小于1000时.将抛出异常
25-
/// 外部不要修改任何值
26-
/// </summary>
27-
public ListenOptions ListenOptions { get; protected set; }
28-
2921
/// <summary>
3022
/// 服务器类型
3123
/// </summary>
@@ -55,7 +47,6 @@ public bool Init(ServerType serverType, AppSetting setting, string[] args = null
5547
{
5648
ServerType = serverType;
5749
Setting = setting;
58-
ListenOptions = new ListenOptions();
5950
Init();
6051
Setting.CheckNotNull(nameof(Setting));
6152
GlobalSettings.SaveIntervalInMilliSeconds = Setting.SaveDataInterval;
@@ -90,6 +81,20 @@ protected virtual void Init()
9081
{
9182
}
9283

84+
/// <summary>
85+
/// 配置启动,当InnerIP为空时.将使用Any
86+
/// </summary>
87+
/// <param name="options"></param>
88+
protected virtual void ConfigureHttp(ServerOptions options)
89+
{
90+
var listenOptions = new ListenOptions
91+
{
92+
Ip = IPAddress.Any.ToString(),
93+
Port = Setting.HttpPort,
94+
};
95+
options.AddListener(listenOptions);
96+
}
97+
9398
/// <summary>
9499
/// 配置启动,当InnerIP为空时.将使用Any
95100
/// </summary>
@@ -104,9 +109,11 @@ protected virtual void ConfigureSuperSocket(ServerOptions options)
104109
}
105110
}
106111

107-
ListenOptions.CheckNotNull(nameof(ListenOptions));
108-
ListenOptions.Ip = Setting.InnerIp.IsNullOrEmpty() ? IPAddress.Any.ToString() : Setting.InnerIp;
109-
ListenOptions.Port = Setting.InnerPort;
110-
options.AddListener(ListenOptions);
112+
var listenOptions = new ListenOptions
113+
{
114+
Ip = Setting.InnerIp.IsNullOrEmpty() ? IPAddress.Any.ToString() : Setting.InnerIp,
115+
Port = Setting.InnerPort,
116+
};
117+
options.AddListener(listenOptions);
111118
}
112119
}

GameFrameX.StartUp/AppStartUpByServer.cs

Lines changed: 106 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1+
using System.Net;
12
using System.Reflection;
23
using GameFrameX.Foundation.Logger;
34
using GameFrameX.NetWork;
45
using GameFrameX.NetWork.Abstractions;
56
using GameFrameX.NetWork.HTTP;
67
using GameFrameX.NetWork.Message;
8+
using GameFrameX.StartUp.Options;
79
using GameFrameX.SuperSocket.Connection;
810
using GameFrameX.SuperSocket.Primitives;
911
using GameFrameX.SuperSocket.ProtoBase;
12+
using GameFrameX.SuperSocket.Server;
1013
using GameFrameX.SuperSocket.Server.Abstractions;
1114
using GameFrameX.SuperSocket.Server.Abstractions.Session;
1215
using GameFrameX.SuperSocket.Server.Host;
@@ -194,18 +197,17 @@ private async Task StartServer<TMessageDecoderHandler, TMessageEncoderHandler>(L
194197
if (Setting.InnerPort > 0 && Net.PortIsAvailable(Setting.InnerPort))
195198
{
196199
LogHelper.InfoConsole($"启动 [TCP] 服务器 - 类型: {ServerType}, 地址: {Setting.InnerIp}, 端口: {Setting.InnerPort}");
200+
hostBuilder.ConfigureServices((context, collection) => { collection.Configure<ServerOptions>(ConfigureSuperSocket); });
197201
hostBuilder.AddServer<IMessage, MessageObjectPipelineFilter>(builder =>
198202
{
199-
builder
200-
.ConfigureSuperSocket(ConfigureSuperSocket)
201-
.UseClearIdleSession()
202-
.UsePackageDecoder<TMessageDecoderHandler>()
203-
.UsePackageEncoder<TMessageEncoderHandler>()
204-
.UseSessionHandler(OnConnected, OnDisconnected)
205-
.UsePackageHandler(PackageHandler, PackageErrorHandler)
206-
.UseInProcSessionContainer();
203+
builder.UseClearIdleSession()
204+
.UsePackageDecoder<TMessageDecoderHandler>()
205+
.UsePackageEncoder<TMessageEncoderHandler>()
206+
.UseSessionHandler(OnConnected, OnDisconnected)
207+
.UsePackageHandler(PackageHandler, PackageErrorHandler)
208+
.UseInProcSessionContainer();
207209
});
208-
LogHelper.InfoConsole($"启动 [WebSocket] 服务器启动完成 - 类型: {ServerType}, 地址: {Setting.InnerIp}, 端口: {Setting.InnerPort}");
210+
LogHelper.InfoConsole($"启动 [TCP] 服务器启动完成 - 类型: {ServerType}, 地址: {Setting.InnerIp}, 端口: {Setting.InnerPort}");
209211
}
210212
else
211213
{
@@ -220,12 +222,11 @@ private async Task StartServer<TMessageDecoderHandler, TMessageEncoderHandler>(L
220222
// 配置并启动WebSocket服务器
221223
hostBuilder.AddWebSocketServer(builder =>
222224
{
223-
builder
224-
.UseWebSocketMessageHandler(WebSocketMessageHandler)
225-
.UseSessionHandler(OnConnected, OnDisconnected)
226-
.ConfigureAppConfiguration((Action<HostBuilderContext, IConfigurationBuilder>)ConfigureWebServer);
225+
builder.UseWebSocketMessageHandler(WebSocketMessageHandler)
226+
.UseSessionHandler(OnConnected, OnDisconnected);
227+
// .ConfigureAppConfiguration((Action<HostBuilderContext, IConfigurationBuilder>)ConfigureWebServer);
227228
});
228-
229+
hostBuilder.ConfigureServices((context, collection) => { collection.Configure<ServerOptions>(ConfigureWebServer); });
229230
LogHelper.InfoConsole($"启动 [WebSocket] 服务器启动完成 - 类型: {ServerType}, 端口: {Setting.WsPort}");
230231
}
231232
else
@@ -236,9 +237,9 @@ private async Task StartServer<TMessageDecoderHandler, TMessageEncoderHandler>(L
236237
if (Setting.HttpPort is > 0 and < ushort.MaxValue && Net.PortIsAvailable(Setting.HttpPort))
237238
{
238239
LogHelper.InfoConsole("启动 [HTTP] 服务器...");
239-
var builder = hostBuilder.ConfigureWebHost(m =>
240+
var builder = hostBuilder.ConfigureWebHost(webHostBuilder =>
240241
{
241-
m.UseKestrel(options =>
242+
webHostBuilder.UseKestrel(options =>
242243
{
243244
options.ListenAnyIP(Setting.HttpPort);
244245

@@ -266,94 +267,95 @@ private async Task StartServer<TMessageDecoderHandler, TMessageEncoderHandler>(L
266267
Description = "GameFrameX HTTP API documentation",
267268
};
268269
var development = Setting.HttpIsDevelopment;
269-
builder.ConfigureServices(services =>
270-
{
271-
if (development)
272-
{
273-
// 开发模式,启用 Swagger
274-
services.AddEndpointsApiExplorer();
275-
services.AddSwaggerGen(options =>
270+
builder.ConfigureWebHostDefaults(webHostBuilder =>
271+
{
272+
webHostBuilder.ConfigureServices((context, services) =>
273+
{
274+
services.Configure<ServerOptions>(ConfigureHttp);
275+
if (development)
276+
{
277+
// 开发模式,启用 Swagger
278+
services.AddEndpointsApiExplorer();
279+
services.AddSwaggerGen(options =>
280+
{
281+
options.SwaggerDoc(openApiInfo.Version, openApiInfo);
282+
283+
// 使用自定义的 SchemaFilter 来保持属性名称大小写
284+
options.SchemaFilter<PreservePropertyCasingSchemaFilter>();
285+
286+
// 添加自定义操作过滤器来处理动态路由
287+
options.OperationFilter<SwaggerOperationFilter>(baseHandler);
288+
// 使用完整的类型名称
289+
options.CustomSchemaIds(type => type.Name);
290+
});
291+
}
292+
}).Configure(app =>
293+
{
294+
if (development)
295+
{
296+
// 开发模式,启用 Swagger
297+
app.UseDeveloperExceptionPage();
298+
app.UseSwagger()
299+
.UseSwaggerUI(options =>
276300
{
277-
options.SwaggerDoc(openApiInfo.Version, openApiInfo);
301+
options.SwaggerEndpoint($"/swagger/{openApiInfo.Version}/swagger.json", openApiInfo.Title);
302+
options.RoutePrefix = "swagger";
303+
});
304+
}
278305

279-
// 使用自定义的 SchemaFilter 来保持属性名称大小写
280-
options.SchemaFilter<PreservePropertyCasingSchemaFilter>();
306+
app.UseExceptionHandler(ExceptionHandler);
281307

282-
// 添加自定义操作过滤器来处理动态路由
283-
options.OperationFilter<SwaggerOperationFilter>(baseHandler);
284-
// 使用完整的类型名称
285-
options.CustomSchemaIds(type => type.Name);
286-
});
287-
}
288-
})
289-
.ConfigureWebHostDefaults(webHostBuilder =>
290-
{
291-
webHostBuilder.Configure(app =>
292-
{
293-
if (development)
294-
{
295-
// 开发模式,启用 Swagger
296-
app.UseDeveloperExceptionPage();
297-
app.UseSwagger()
298-
.UseSwaggerUI(options =>
299-
{
300-
options.SwaggerEndpoint($"/swagger/{openApiInfo.Version}/swagger.json", openApiInfo.Title);
301-
options.RoutePrefix = "swagger";
302-
});
303-
}
304-
305-
app.UseExceptionHandler(ExceptionHandler);
306-
307-
var apiRootPath = Setting.HttpUrl;
308-
// 根路径必须以/开头和以/结尾
309-
if (!Setting.HttpUrl.StartsWith('/'))
310-
{
311-
apiRootPath = "/" + Setting.HttpUrl;
312-
}
308+
var apiRootPath = Setting.HttpUrl;
309+
// 根路径必须以/开头和以/结尾
310+
if (!Setting.HttpUrl.StartsWith('/'))
311+
{
312+
apiRootPath = "/" + Setting.HttpUrl;
313+
}
313314

314-
if (!Setting.HttpUrl.EndsWith('/'))
315-
{
316-
apiRootPath += "/";
317-
}
315+
if (!Setting.HttpUrl.EndsWith('/'))
316+
{
317+
apiRootPath += "/";
318+
}
318319

319-
GlobalSettings.ApiRootPath = apiRootPath;
320-
// 注册中间件
321-
app.UseEndpoints(configure =>
322-
{
323-
// 每个http处理器,注册到路由中
324-
foreach (var handler in baseHandler)
325-
{
326-
var handlerType = handler.GetType();
327-
var mappingAttribute = handlerType.GetCustomAttribute<HttpMessageMappingAttribute>();
328-
if (mappingAttribute == null)
329-
{
330-
continue;
331-
}
332-
333-
// 只支持POST请求
334-
var route = configure.MapPost($"{apiRootPath}{mappingAttribute.StandardCmd}", async (HttpContext context, string text) => { await HttpHandler.HandleRequest(context, httpFactory, aopHandlerTypes); });
335-
if (development)
336-
{
337-
// 开发模式,启用 Swagger
338-
route.WithOpenApi(operation =>
339-
{
340-
operation.Summary = "处理 POST 请求";
341-
operation.Description = "处理来自游戏客户端的 POST 请求";
342-
return operation;
343-
});
344-
}
345-
}
346-
});
347-
if (development)
348-
{
349-
var ipList = Net.GetLocalIpList();
350-
foreach (var ip in ipList)
351-
{
352-
LogHelper.DebugConsole($"Swagger UI 可通过 http://{ip}:{Setting.HttpPort}/swagger 访问");
353-
}
354-
}
355-
});
356-
});
320+
GlobalSettings.ApiRootPath = apiRootPath;
321+
// 注册中间件
322+
app.UseEndpoints(configure =>
323+
{
324+
// 每个http处理器,注册到路由中
325+
foreach (var handler in baseHandler)
326+
{
327+
var handlerType = handler.GetType();
328+
var mappingAttribute = handlerType.GetCustomAttribute<HttpMessageMappingAttribute>();
329+
if (mappingAttribute == null)
330+
{
331+
continue;
332+
}
333+
334+
// 只支持POST请求
335+
var route = configure.MapPost($"{apiRootPath}{mappingAttribute.StandardCmd}", async (HttpContext context, string text) => { await HttpHandler.HandleRequest(context, httpFactory, aopHandlerTypes); });
336+
if (development)
337+
{
338+
// 开发模式,启用 Swagger
339+
route.WithOpenApi(operation =>
340+
{
341+
operation.Summary = "处理 POST 请求";
342+
operation.Description = "处理来自游戏客户端的 POST 请求";
343+
return operation;
344+
});
345+
}
346+
}
347+
});
348+
if (development)
349+
{
350+
var ipList = Net.GetLocalIpList();
351+
foreach (var ip in ipList)
352+
{
353+
LogHelper.DebugConsole($"Swagger UI 可通过 http://{ip}:{Setting.HttpPort}/swagger 访问");
354+
}
355+
}
356+
});
357+
});
358+
LogHelper.InfoConsole($"启动 [HTTP] 服务器启动完成 - 端口: {Setting.HttpPort}");
357359
}
358360
else
359361
{
@@ -391,8 +393,6 @@ private async Task StartServer<TMessageDecoderHandler, TMessageEncoderHandler>(L
391393
MessageEncoderHandler = messageEncoderHandler;
392394

393395
await _gameServer.StartAsync();
394-
395-
LogHelper.InfoConsole($"TCP服务器启动完成 - 类型: {ServerType}, 端口: {Setting.InnerPort}");
396396
}
397397

398398
/// <summary>
@@ -418,15 +418,14 @@ private static void ExceptionHandler(IApplicationBuilder errorContext)
418418
/// <summary>
419419
/// 配置WebSocket服务器参数
420420
/// </summary>
421-
private void ConfigureWebServer(HostBuilderContext context, IConfigurationBuilder builder)
421+
private void ConfigureWebServer(ServerOptions serverOptions)
422422
{
423-
var paramsDict = new Dictionary<string, string>
423+
var listenOptions = new ListenOptions
424424
{
425-
["serverOptions:listeners:0:port"] = Setting.WsPort.ToString(),
426-
["serverOptions:listeners:0:ip"] = Setting.InnerIp.IsNullOrWhiteSpace() ? "Any" : Setting.InnerIp,
427-
["serverOptions:name"] = Setting.ServerName
425+
Ip = IPAddress.Any.ToString(),
426+
Port = Setting.WsPort,
428427
};
429-
builder.AddInMemoryCollection(paramsDict);
428+
serverOptions.AddListener(listenOptions);
430429
}
431430

432431
/// <summary>

0 commit comments

Comments
 (0)