球球了给个Star罢!
https://github.com/Corona-Studio/ConnectX
[MD] # ConnectX [README in English](https://github.com/Corona-Studio/ConnectX/blob/main/README.md)         一个跨平台的 Minecraft P2P 在线多人库,支持异地跨网联机,采用 C# 开发,使用高性能套接字实现出色的转发性能,由 Zerotier SDK 实现 P2P 功能。 由我们的另一个开源项目提供支持: [Hive.Framework](https://github.com/Corona-Studio/Hive.Framework)  ## 架构图  ## 快速开始! 我们使用 MSDI(`Microsoft.Extensions.DependencyInjection`)作为 DI 容器。最佳做法是在程序中使用 `.NET Generic Host`。 首先,为服务器配置添加以下方法,`ConnectXServerIp` 将是 ConnectX.Server 的后台地址。 ```c# private static IClientSettingProvider GetConnectXSettings() { var serverIp = IPAddress.None; try { var ips = Dns.GetHostAddresses(ConnectXServerIp); var ipv4Addresses = ips .Where(ip => ip.AddressFamily == AddressFamily.InterNetwork) .Where(ip => !ip.IsLocalIpAddress()) .ToArray(); if (ipv4Addresses.Length > 0) serverIp = ipv4Addresses[0]; } catch (Exception ex) { Log.Logger.Error(ex, "Failed to resolve ConnectX server IP."); } return new DefaultClientSettingProvider { ServerAddress = serverIp, ServerPort = ConnectXServerPort, JoinP2PNetwork = true }; } ``` 然后,只需要再添加一行即可完成配置! ```diff private static void ConfigureServices(IServiceCollection services) { // ... + services.UseConnectX(GetConnectXSettings); // ... } ``` ## 如何使用? 将 `IServerLinkHolder` 和 `Client` 注入要管理房间实例的 ViewModel 当中。 ### 连接到服务器 ```c# await _serverLinkHolder.ConnectAsync(CancellationToken.None); ``` ### 执行任何房间相关操作 > 注意! > 请确保在执行任何房间操作前您已经成功和服务器建立了连接,否则可能会出现预期之外的结果! > > ```c# > await TaskHelper.WaitUntilAsync(() => _serverLinkHolder is { IsConnected: true, IsSignedIn: true }); > ``` ```c# var message = new CreateGroup { UserId = _serverLinkHolder.UserId, RoomName = createRoomRecord.RoomName, RoomDescription = createRoomRecord.RoomDescription, RoomPassword = createRoomRecord.RoomPassword, IsPrivate = createRoomRecord.IsPrivateRoom, MaxUserCount = 3 }; var (groupInfo, status, err) = await _multiPlayerClient.CreateGroupAsync(message, CancellationToken.None); if (groupInfo == null || status != GroupCreationStatus.Succeeded || !string.IsNullOrEmpty(err)) { // Error process return; } _multiPlayerClient.OnGroupStateChanged += MultiPlayerClientOnGroupStateChanged; // Other actions ``` ## 开源协议 MIT。这意味着您可以出于任何目的修改或使用我们的代码,但您的软件的所有副本或重要部分都应包含版权声明和许可声明。 ## 统计信息  ## 免责声明 ConnectX 与 Mojang 或其软件的任何部分均无关联。 ## 耻辱柱 在此,我们将列出所有使用我们的代码但未遵守 MIT 许可的程序。 [/MD]
https://github.com/Corona-Studio/ConnectX
[MD] # ConnectX [README in English](https://github.com/Corona-Studio/ConnectX/blob/main/README.md)         一个跨平台的 Minecraft P2P 在线多人库,支持异地跨网联机,采用 C# 开发,使用高性能套接字实现出色的转发性能,由 Zerotier SDK 实现 P2P 功能。 由我们的另一个开源项目提供支持: [Hive.Framework](https://github.com/Corona-Studio/Hive.Framework)  ## 架构图  ## 快速开始! 我们使用 MSDI(`Microsoft.Extensions.DependencyInjection`)作为 DI 容器。最佳做法是在程序中使用 `.NET Generic Host`。 首先,为服务器配置添加以下方法,`ConnectXServerIp` 将是 ConnectX.Server 的后台地址。 ```c# private static IClientSettingProvider GetConnectXSettings() { var serverIp = IPAddress.None; try { var ips = Dns.GetHostAddresses(ConnectXServerIp); var ipv4Addresses = ips .Where(ip => ip.AddressFamily == AddressFamily.InterNetwork) .Where(ip => !ip.IsLocalIpAddress()) .ToArray(); if (ipv4Addresses.Length > 0) serverIp = ipv4Addresses[0]; } catch (Exception ex) { Log.Logger.Error(ex, "Failed to resolve ConnectX server IP."); } return new DefaultClientSettingProvider { ServerAddress = serverIp, ServerPort = ConnectXServerPort, JoinP2PNetwork = true }; } ``` 然后,只需要再添加一行即可完成配置! ```diff private static void ConfigureServices(IServiceCollection services) { // ... + services.UseConnectX(GetConnectXSettings); // ... } ``` ## 如何使用? 将 `IServerLinkHolder` 和 `Client` 注入要管理房间实例的 ViewModel 当中。 ### 连接到服务器 ```c# await _serverLinkHolder.ConnectAsync(CancellationToken.None); ``` ### 执行任何房间相关操作 > 注意! > 请确保在执行任何房间操作前您已经成功和服务器建立了连接,否则可能会出现预期之外的结果! > > ```c# > await TaskHelper.WaitUntilAsync(() => _serverLinkHolder is { IsConnected: true, IsSignedIn: true }); > ``` ```c# var message = new CreateGroup { UserId = _serverLinkHolder.UserId, RoomName = createRoomRecord.RoomName, RoomDescription = createRoomRecord.RoomDescription, RoomPassword = createRoomRecord.RoomPassword, IsPrivate = createRoomRecord.IsPrivateRoom, MaxUserCount = 3 }; var (groupInfo, status, err) = await _multiPlayerClient.CreateGroupAsync(message, CancellationToken.None); if (groupInfo == null || status != GroupCreationStatus.Succeeded || !string.IsNullOrEmpty(err)) { // Error process return; } _multiPlayerClient.OnGroupStateChanged += MultiPlayerClientOnGroupStateChanged; // Other actions ``` ## 开源协议 MIT。这意味着您可以出于任何目的修改或使用我们的代码,但您的软件的所有副本或重要部分都应包含版权声明和许可声明。 ## 统计信息  ## 免责声明 ConnectX 与 Mojang 或其软件的任何部分均无关联。 ## 耻辱柱 在此,我们将列出所有使用我们的代码但未遵守 MIT 许可的程序。 [/MD]