Flutter游戏服务器管理插件agones的使用

Flutter 游戏服务器管理插件 Agones 的使用

Agones

pub package

Agones 是一个用于在 Kubernetes 上托管、运行和扩展专用游戏服务器的库。
该包主要是一个通过 protoc 生成的 gRPC 客户端。

用于生成此包中包含的 Dart 代码的 shell 脚本位于 scripts/generator.sh
应该从本地克隆的 Agones GitHub 仓库 运行此脚本。

开始使用

查看 example/agones.dart 文件中的示例。 它旨在与运行在本地模式下的 Agones SDK 服务器 一起在本地开发环境中运行。

示例代码

import 'package:agones/agones.dart';
import 'package:grpc/grpc.dart';
import 'package:collection/collection.dart';

void main(List<String> arguments) async {
  if (arguments.isEmpty) {
    throw Exception('Port argument required. Specify with `--port=YOUR_PORT`.');
  }
  final port = parseArguments(arguments);
  if (port is! int) {
    throw Exception('Invalid port specified.');
  }

  print('Connecting to localhost on Port: $port.');

  // 创建一个到本地主机的 gRPC 客户端连接
  final sdkClient = SDKClient(ClientChannel('localhost',
      port: port,
      // 在生产环境中不应使用不安全模式
      options: ChannelOptions(credentials: ChannelCredentials.insecure())));

  // 监听并打印来自游戏服务器的响应
  await for (final value in sdkClient.watchGameServer(Empty())) {
    print(value.toString());
  }

  print('Finished.');
}

// 解析命令行参数以获取端口号
const pattern = '--port=';
int? parseArguments(List<String> arguments) {
  final match = arguments.firstWhereOrNull((element) => element.startsWith(pattern));
  if (match == null) return null;

  return int.tryParse(match.split(pattern).last);
}

上述代码展示了如何使用 Agones 插件连接到本地的游戏服务器,并监听游戏服务器的状态更新。

代码解释

  • 导入必要的库

    import 'package:agones/agones.dart'; // Agones 库
    import 'package:grpc/grpc.dart'; // gRPC 库
    import 'package:collection/collection.dart'; // 集合操作库
    
  • 解析命令行参数

    if (arguments.isEmpty) {
      throw Exception('Port argument required. Specify with `--port=YOUR_PORT`.');
    }
    final port = parseArguments(arguments);
    if (port is! int) {
      throw Exception('Invalid port specified.');
    }
    

    检查是否提供了端口号参数,并解析该参数。

  • 创建 gRPC 客户端

    final sdkClient = SDKClient(ClientChannel('localhost',
        port: port,
        // 在生产环境中不应使用不安全模式
        options: ChannelOptions(credentials: ChannelCredentials.insecure())));
    

    使用提供的端口号创建一个 gRPC 客户端连接到本地主机。

  • 监听游戏服务器状态

    await for (final value in sdkClient.watchGameServer(Empty())) {
      print(value.toString());
    }
    

    监听游戏服务器的状态变化,并将结果打印到控制台。

  • 结束语句

    print('Finished.');
    

更多关于Flutter游戏服务器管理插件agones的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter游戏服务器管理插件agones的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Agones 是一个开源的、基于 Kubernetes 的游戏服务器管理和编排系统,专为多人在线游戏设计。它可以帮助开发者轻松地管理游戏服务器的生命周期,包括服务器的创建、分配、扩展和回收。结合 Flutter,你可以使用 Agones 来管理游戏服务器的后端逻辑。

以下是使用 Agones 与 Flutter 结合的基本步骤:

1. 安装 Agones

首先,你需要在 Kubernetes 集群中安装 Agones。你可以通过以下步骤安装:

# 安装 Helm(如果尚未安装)
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

# 添加 Agones Helm 仓库
helm repo add agones https://agones.dev/chart/stable
helm repo update

# 安装 Agones
helm install my-release --namespace agones-system --create-namespace agones/agones

2. 创建 Agones GameServer

Agones 使用 GameServer 资源来管理游戏服务器实例。你可以通过 YAML 文件定义一个 GameServer

apiVersion: "agones.dev/v1"
kind: GameServer
metadata:
  name: my-gameserver
spec:
  ports:
    - name: default
      portPolicy: Dynamic
      containerPort: 7777
  template:
    spec:
      containers:
        - name: gameserver
          image: my-gameserver-image:latest

使用 kubectl 创建 GameServer

kubectl apply -f my-gameserver.yaml

3. 在 Flutter 中连接 Agones

在 Flutter 中,你可以使用 httpsocket_io 等库来连接到 Agones 管理的游戏服务器。

首先,添加 httpsocket_io 依赖到你的 pubspec.yaml

dependencies:
  http: ^0.13.3
  socket_io_client: ^1.0.0

然后,在 Flutter 代码中连接到游戏服务器:

import 'package:http/http.dart' as http;
import 'package:socket_io_client/socket_io_client.dart' as IO;

void main() async {
  // 获取 GameServer 的地址和端口
  final response = await http.get(Uri.parse('http://my-gameserver-address:port'));

  if (response.statusCode == 200) {
    final serverAddress = response.body;

    // 使用 socket.io 连接到游戏服务器
    IO.Socket socket = IO.io(serverAddress, <String, dynamic>{
      'transports': ['websocket'],
      'autoConnect': true,
    });

    socket.onConnect((_) {
      print('Connected to game server');
    });

    socket.on('gameEvent', (data) {
      print('Received game event: $data');
    });

    socket.onDisconnect((_) {
      print('Disconnected from game server');
    });
  } else {
    print('Failed to get game server address');
  }
}

4. 管理 GameServer 生命周期

Agones 提供了 SDK 来管理 GameServer 的生命周期。你可以在游戏服务器代码中使用 Agones SDK 来标记服务器为“就绪”、“分配”或“关闭”。

例如,使用 Agones SDK(假设你使用的是 Go):

package main

import (
	"log"
	"time"
	"agones.dev/agones/sdks/go"
)

func main() {
	sdk, err := sdk.NewSDK()
	if err != nil {
		log.Fatalf("Could not connect to sdk: %v", err)
	}

	// 标记服务器为就绪
	if err := sdk.Ready(); err != nil {
		log.Fatalf("Could not send ready message: %v", err)
	}

	// 等待分配
	for {
		gs, err := sdk.GameServer()
		if err != nil {
			log.Fatalf("Could not get gameserver: %v", err)
		}

		if gs.Status.State == "Allocated" {
			log.Println("GameServer has been allocated")
			break
		}

		time.Sleep(time.Second)
	}

	// 游戏逻辑...
}
回到顶部