Skip to content

Commit 4374799

Browse files
committed
feat(startup): 集成 KCP 服务器启动
- 添加 IsEnableKcp 和 KcpPort 配置属性 - 在 AppStartUpByServer 中集成 KCP 服务器启动逻辑 - 添加 KCP 服务器相关本地化键
1 parent 886b705 commit 4374799

3 files changed

Lines changed: 147 additions & 0 deletions

File tree

GameFrameX.Localization/Keys.StartUp.cs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,6 +565,72 @@ public static class WebSocketServer
565565
public const string ServiceNotEnabled = "StartUp.WebSocketServer.ServiceNotEnabled";
566566
}
567567

568+
/// <summary>
569+
/// KCP服务器相关消息
570+
/// </summary>
571+
public static class KcpServer
572+
{
573+
/// <summary>
574+
/// 客户端断开连接 - 远程终端: {0}
575+
/// </summary>
576+
/// <remarks>
577+
/// 键名: StartUp.KcpServer.ClientDisconnected
578+
/// 用途: 当KCP客户端断开连接时记录
579+
/// 参数: {0} - 远程端点
580+
/// </remarks>
581+
public const string ClientDisconnected = "StartUp.KcpServer.ClientDisconnected";
582+
583+
/// <summary>
584+
/// 新客户端连接 - 远程终端: {0}
585+
/// </summary>
586+
/// <remarks>
587+
/// 键名: StartUp.KcpServer.NewClientConnection
588+
/// 用途: 当新KCP客户端连接时记录
589+
/// 参数: {0} - 远程端点
590+
/// </remarks>
591+
public const string NewClientConnection = "StartUp.KcpServer.NewClientConnection";
592+
593+
/// <summary>
594+
/// 启动KCP服务器 类型: {0}, 地址: {1}, 端口: {2}
595+
/// </summary>
596+
/// <remarks>
597+
/// 键名: StartUp.KcpServer.StartingServer
598+
/// 用途: 当开始启动KCP服务器时记录
599+
/// 参数: {0} - 服务器类型, {1} - 地址, {2} - 端口
600+
/// </remarks>
601+
public const string StartingServer = "StartUp.KcpServer.StartingServer";
602+
603+
/// <summary>
604+
/// 启动KCP服务器完成 类型: {0}, 地址: {1}, 端口: {2}
605+
/// </summary>
606+
/// <remarks>
607+
/// 键名: StartUp.KcpServer.StartupComplete
608+
/// 用途: 当KCP服务器启动完成时记录
609+
/// 参数: {0} - 服务器类型, {1} - 地址, {2} - 端口
610+
/// </remarks>
611+
public const string StartupComplete = "StartUp.KcpServer.StartupComplete";
612+
613+
/// <summary>
614+
/// 启动KCP服务器失败 类型: {0}, 地址: {1}, 端口: {2}, 原因: 端口无效或被占用
615+
/// </summary>
616+
/// <remarks>
617+
/// 键名: StartUp.KcpServer.StartupFailed
618+
/// 用途: 当KCP服务器启动失败时记录警告
619+
/// 参数: {0} - 服务器类型, {1} - 地址, {2} - 端口
620+
/// </remarks>
621+
public const string StartupFailed = "StartUp.KcpServer.StartupFailed";
622+
623+
/// <summary>
624+
/// 启动KCP服务器 类型: {0}, 地址: {1}, 端口: {2}, 原因: KCP服务器被禁用
625+
/// </summary>
626+
/// <remarks>
627+
/// 键名: StartUp.KcpServer.ServerDisabled
628+
/// 用途: 当KCP服务器被禁用时记录
629+
/// 参数: {0} - 服务器类型, {1} - 地址, {2} - 端口
630+
/// </remarks>
631+
public const string ServerDisabled = "StartUp.KcpServer.ServerDisabled";
632+
}
633+
568634
/// <summary>
569635
/// 发现中心相关消息
570636
/// </summary>

GameFrameX.StartUp/AppStartUpByServer.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,13 @@
2929
// Official Documentation: https://gameframex.doc.alianblank.com/
3030
// ==========================================================================================
3131

32+
using System.Net;
3233
using GameFrameX.AppHost.ServiceDefaults;
3334
using GameFrameX.Foundation.Logger;
3435
using GameFrameX.Foundation.Localization.Core;
3536
using GameFrameX.NetWork.Abstractions;
3637
using GameFrameX.NetWork.HTTP;
38+
using GameFrameX.NetWork.Kcp;
3739
using GameFrameX.NetWork.Message;
3840
using GameFrameX.SuperSocket.Connection;
3941
using GameFrameX.SuperSocket.Primitives;
@@ -171,6 +173,41 @@ protected virtual ValueTask OnDisconnected(IAppSession appSession, CloseEventArg
171173
return ValueTask.CompletedTask;
172174
}
173175

176+
/// <summary>
177+
/// KCP客户端连接成功处理
178+
/// </summary>
179+
/// <param name="remoteEndPoint">远程端点</param>
180+
/// <returns></returns>
181+
protected virtual ValueTask OnKcpConnected(EndPoint remoteEndPoint)
182+
{
183+
LogHelper.Info(LocalizationService.GetString(Localization.Keys.StartUp.KcpServer.NewClientConnection, remoteEndPoint));
184+
return ValueTask.CompletedTask;
185+
}
186+
187+
/// <summary>
188+
/// KCP消息处理方法
189+
/// </summary>
190+
/// <param name="session">游戏应用会话</param>
191+
/// <param name="message">接收到的消息</param>
192+
protected virtual void KcpPackageHandler(IGameAppSession session, IMessage message)
193+
{
194+
if (Setting.IsDebug && Setting.IsDebugReceive)
195+
{
196+
LogHelper.Debug(LocalizationService.GetString(Localization.Keys.StartUp.TcpServer.MessageReceived, ServerType, message.ToFormatMessageString()));
197+
}
198+
}
199+
200+
/// <summary>
201+
/// KCP客户端断开连接处理
202+
/// </summary>
203+
/// <param name="remoteEndPoint">远程端点</param>
204+
/// <returns></returns>
205+
protected virtual ValueTask OnKcpDisconnected(EndPoint remoteEndPoint)
206+
{
207+
LogHelper.Info(LocalizationService.GetString(Localization.Keys.StartUp.KcpServer.ClientDisconnected, remoteEndPoint));
208+
return ValueTask.CompletedTask;
209+
}
210+
174211
/// <summary>
175212
/// 客户端连接成功时的处理方法。
176213
/// </summary>
@@ -358,6 +395,34 @@ private async Task StartServer(List<BaseHttpHandler> baseHandler, Func<string, B
358395
LogHelper.Info(LocalizationService.GetString(Localization.Keys.StartUp.WebSocketServer.ServiceNotEnabled, ServerType, Setting.WsPort));
359396
}
360397

398+
// 启动KCP服务器
399+
if (Setting.IsEnableKcp)
400+
{
401+
var kcpPort = Setting.KcpPort > 0 ? Setting.KcpPort : Setting.InnerPort;
402+
if (kcpPort > 0 && NetHelper.PortIsAvailable(kcpPort))
403+
{
404+
LogHelper.Info(LocalizationService.GetString(Localization.Keys.StartUp.KcpServer.StartingServer, ServerType, Setting.InnerHost, kcpPort));
405+
var kcpServer = new KcpServer(
406+
kcpPort,
407+
new KcpOptions { Enable = true },
408+
Setting,
409+
KcpPackageHandler,
410+
OnKcpConnected,
411+
OnKcpDisconnected
412+
);
413+
_ = kcpServer.StartAsync();
414+
LogHelper.Info(LocalizationService.GetString(Localization.Keys.StartUp.KcpServer.StartupComplete, ServerType, Setting.InnerHost, kcpPort));
415+
}
416+
else
417+
{
418+
LogHelper.Warning(LocalizationService.GetString(Localization.Keys.StartUp.KcpServer.StartupFailed, ServerType, Setting.InnerHost, kcpPort));
419+
}
420+
}
421+
else
422+
{
423+
LogHelper.Info(LocalizationService.GetString(Localization.Keys.StartUp.KcpServer.ServerDisabled, ServerType, Setting.InnerHost, Setting.KcpPort));
424+
}
425+
361426
// await StartHttpServerAsync(hostBuilder,baseHandler, httpFactory, aopHandlerTypes, minimumLevelLogLevel);
362427
await StartHttpServer(baseHandler, httpFactory, aopHandlerTypes, minimumLevelLogLevel);
363428

GameFrameX.Utility/Setting/AppSetting.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,22 @@ public string ToFormatString()
418418
/// </remarks>
419419
public bool IsEnableUdp { get; set; } = false;
420420

421+
/// <summary>
422+
/// 是否启用KCP
423+
/// </summary>
424+
/// <remarks>
425+
/// Whether to enable KCP. Default is false.
426+
/// </remarks>
427+
public bool IsEnableKcp { get; set; } = false;
428+
429+
/// <summary>
430+
/// KCP端口
431+
/// </summary>
432+
/// <remarks>
433+
/// KCP server port. Default is 0 (uses same port as TCP).
434+
/// </remarks>
435+
public int KcpPort { get; set; } = 0;
436+
421437
/// <summary>
422438
/// 内部主机地址
423439
/// </summary>

0 commit comments

Comments
 (0)