Skip to content

Commit

Permalink
up 修复部分问题
Browse files Browse the repository at this point in the history
  • Loading branch information
Coloryr committed Feb 29, 2024
1 parent f82bbe8 commit 772c893
Show file tree
Hide file tree
Showing 36 changed files with 481 additions and 561 deletions.
86 changes: 38 additions & 48 deletions src/ColorMC.Core/Asm/NettyServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,50 +2,36 @@
using DotNetty.Transport.Bootstrapping;
using DotNetty.Transport.Channels;
using DotNetty.Transport.Channels.Sockets;
using System.Collections.Concurrent;
using System.Net;
using System.Net.NetworkInformation;

namespace ColorMC.Core.Asm;

public static class NettyServer
{
private static IEventLoopGroup bossGroup;
private static IEventLoopGroup workerGroup;
private static ServerBootstrap bootstrap;
private static IChannel boundChannel;
private static IEventLoopGroup s_bossGroup;
private static IEventLoopGroup s_workerGroup;
private static ServerBootstrap s_bootstrap;
private static IChannel s_channel;

private static List<IChannel> channels = [];
private static readonly List<IChannel> s_channels = [];

public static Action<IByteBuffer>? GetPack;

/// <summary>
/// 获取操作系统已用的端口号
/// </summary>
/// <returns></returns>
public static List<int> PortIsUsed()
private static List<int> PortIsUsed()
{
//获取本地计算机的网络连接和通信统计数据的信息
IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();

//返回本地计算机上的所有Tcp监听程序
IPEndPoint[] ipsTCP = ipGlobalProperties.GetActiveTcpListeners();

//返回本地计算机上的所有UDP监听程序
IPEndPoint[] ipsUDP = ipGlobalProperties.GetActiveUdpListeners();

//返回本地计算机上的Internet协议版本4(IPV4 传输控制协议(TCP)连接的信息。
TcpConnectionInformation[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();
var ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
var ipsTCP = ipGlobalProperties.GetActiveTcpListeners();
var ipsUDP = ipGlobalProperties.GetActiveUdpListeners();
var tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();

var allPorts = new List<int>();
foreach (IPEndPoint ep in ipsTCP) allPorts.Add(ep.Port);
foreach (IPEndPoint ep in ipsUDP) allPorts.Add(ep.Port);
foreach (TcpConnectionInformation conn in tcpConnInfoArray) allPorts.Add(conn.LocalEndPoint.Port);
foreach (var ep in ipsTCP) allPorts.Add(ep.Port);
foreach (var ep in ipsUDP) allPorts.Add(ep.Port);
foreach (var conn in tcpConnInfoArray) allPorts.Add(conn.LocalEndPoint.Port);

return allPorts;
}

public static int GetFirstAvailablePort()
private static int GetFirstAvailablePort()
{
var portUsed = PortIsUsed();
if (portUsed.Count > 50000)
Expand All @@ -66,26 +52,26 @@ public static int GetFirstAvailablePort()

public static async Task<int> RunServerAsync()
{
if (boundChannel != null)
if (s_channel != null)
{
return (boundChannel.LocalAddress as IPEndPoint)!.Port;
return (s_channel.LocalAddress as IPEndPoint)!.Port;
}
bossGroup = new MultithreadEventLoopGroup(1);
workerGroup = new MultithreadEventLoopGroup();
s_bossGroup = new MultithreadEventLoopGroup(1);
s_workerGroup = new MultithreadEventLoopGroup();
try
{
bootstrap = new();
bootstrap.Group(bossGroup, workerGroup);
bootstrap.Channel<TcpServerSocketChannel>();
bootstrap
s_bootstrap = new();
s_bootstrap.Group(s_bossGroup, s_workerGroup);
s_bootstrap.Channel<TcpServerSocketChannel>();
s_bootstrap
.ChildHandler(new ActionChannelInitializer<IChannel>(channel =>
{
IChannelPipeline pipeline = channel.Pipeline;
pipeline.AddLast("echo", new EchoServerHandler());
}));

int port = GetFirstAvailablePort();
boundChannel = await bootstrap.BindAsync(port);
s_channel = await s_bootstrap.BindAsync(port);
ColorMCCore.Stop += Stop;

return port;
Expand All @@ -96,17 +82,21 @@ public static async Task<int> RunServerAsync()
}
}

public static async void Stop()
private static async void Stop()
{
await boundChannel.CloseAsync();
await s_channel.CloseAsync();
await Task.WhenAll(
bossGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)),
workerGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)));
s_bossGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)),
s_workerGroup.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)));
}

/// <summary>
/// 发送数据到所有客户端
/// </summary>
/// <param name="byteBuffer"></param>
public static void SendMessage(IByteBuffer byteBuffer)
{
foreach (var item in channels.ToArray())
foreach (var item in s_channels.ToArray())
{
try
{
Expand All @@ -116,29 +106,29 @@ public static void SendMessage(IByteBuffer byteBuffer)
}
}
catch
{
{

}
}
}

public class EchoServerHandler : ChannelHandlerAdapter
private class EchoServerHandler : ChannelHandlerAdapter
{
public override void ChannelActive(IChannelHandlerContext ctx)
{
channels.Add(ctx.Channel);
s_channels.Add(ctx.Channel);
}

public override void ChannelInactive(IChannelHandlerContext ctx)
{
channels.Remove(ctx.Channel);
s_channels.Remove(ctx.Channel);
}

public override void ChannelRead(IChannelHandlerContext context, object message)
{
if (message is IByteBuffer buffer)
{
GetPack?.Invoke(buffer);
ColorMCCore.NettyPack?.Invoke(context.Channel, buffer);
}
}

Expand Down
46 changes: 38 additions & 8 deletions src/ColorMC.Core/CoreMain.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
using ColorMC.Core.Config;
using ColorMC.Core.Downloader;
using ColorMC.Core.Game;
using ColorMC.Core.Helpers;
using ColorMC.Core.LaunchPath;
using ColorMC.Core.Net;
using ColorMC.Core.Objs;
using ColorMC.Core.Objs.Login;
using ColorMC.Core.Utils;
using DotNetty.Buffers;
using DotNetty.Transport.Channels;
using System.Collections.Concurrent;
using System.Diagnostics;

namespace ColorMC.Core;
Expand Down Expand Up @@ -69,10 +73,6 @@ public static class ColorMCCore
/// </summary>
public static event Action<string?, Exception?, bool>? OnError;
/// <summary>
/// 游戏进程日志回调
/// </summary>
public static event Action<Process?, string?>? OnProcessLog;
/// <summary>
/// 游戏日志回调
/// </summary>
public static event Action<GameSettingObj, string?>? OnGameLog;
Expand All @@ -81,6 +81,16 @@ public static class ColorMCCore
/// </summary>
public static event Action<LanguageType>? OnLanguageReload;

/// <summary>
/// 收到游戏数据包
/// </summary>
public static Action<IChannel, IByteBuffer>? NettyPack;

/// <summary>
/// 游戏退出事件
/// </summary>
public static event Action<GameSettingObj, LoginObj, int> GameExit;

/// <summary>
/// 手机端启动
/// </summary>
Expand Down Expand Up @@ -120,6 +130,9 @@ public static class ColorMCCore
/// </summary>
internal static event Action? Stop;

internal static ConcurrentDictionary<string, IGameHandel> Games = [];


/// <summary>
/// 初始化阶段1
/// </summary>
Expand Down Expand Up @@ -174,13 +187,30 @@ public static void GameLog(GameSettingObj obj, string? text)
OnGameLog?.Invoke(obj, text);
}

public static void GameLog(Process? process, string? text)
public static void LanguageReload(LanguageType type)
{
OnProcessLog?.Invoke(process, text);
OnLanguageReload?.Invoke(type);
}

public static void LanguageReload(LanguageType type)
public static void OnGameExit(GameSettingObj obj, LoginObj obj1, int code)
{
OnLanguageReload?.Invoke(type);
Games.TryRemove(obj.UUID, out _);
GameExit?.Invoke(obj, obj1, code);
}

public static void KillGame(string uuid)
{
if (Games.TryGetValue(uuid, out var handel))
{
handel.Kill();
}
}

internal static void AddGame(string uuid, IGameHandel handel)
{
if (!Games.TryAdd(uuid, handel))
{
Games[uuid] = handel;
}
}
}
24 changes: 24 additions & 0 deletions src/ColorMC.Core/Game/GameHandel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System.Diagnostics;

namespace ColorMC.Core.Game;

public interface IGameHandel
{
public string UUID { get; }
public bool IsExit { get; }
public IntPtr Handel { get; }
public void Kill();
}

public class DesktopGameHandel(Process process, string uuid) : IGameHandel
{
public Process Process => process;
public string UUID => uuid;
public bool IsExit => process.HasExited;
public IntPtr Handel => process.MainWindowHandle;

public void Kill()
{
process.Kill();
}
}
Loading

0 comments on commit 772c893

Please sign in to comment.