Flutter游戏服务器交互插件nakama的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter游戏服务器交互插件nakama的使用

Nakama 是一个开源的游戏和应用服务器,支持用户账户、聊天、社交、匹配器、实时多人游戏等功能。本文将介绍如何在Flutter项目中使用 Nakama 插件与游戏服务器进行交互。

🚀 开始使用

在连接客户端之前,您需要先设置服务器和数据库。最简单的方法是使用 Docker 安装 Nakama 服务器,也可以参考 服务器文档 获取其他安装选项。

安装SDK

  1. pubspec.yaml 文件中添加 nakama 依赖:
name: your_game
dependencies:
    flutter:
        sdk: flutter
    nakama: ^1.2.0
  1. 使用连接凭证构建客户端对象:
final client = getNakamaClient(
  host: '127.0.0.1',
  ssl: false,
  serverKey: 'defaultkey',
  grpcPort: 7349, // 可选
  httpPort: 7350, // 可选
);

使用方法

客户端对象提供了多种方法来执行服务器中的各种功能或打开与服务器的实时套接字连接。

认证

有多种方式可以与服务器进行认证,例如通过电子邮件认证,也可以通过 Google Play Games、Facebook 等社交媒体账号进行认证。

final session = await getNakamaClient().authenticateEmail(
    email: 'foo@bar.de',
    password: 'mySecurePassword!',
);

print('Hey, you are logged in! UserID: ${session.userId}');

会话管理

当成功认证后,服务器会返回一个 JWT token,并将其反序列化为一个 Session 对象。

session.AuthToken // 原始JWT令牌
session.UserId // 用户ID
session.Username // 用户名
session.IsExpired // 表示会话是否过期的布尔值
session.ExpireTime // 过期时间(秒)

建议在启动时存储会话令牌并检查它是否已过期。如果令牌已过期,则必须重新认证。

final inOneHour = DateTime.now().add(Duration(hours: 1));

if (session.isExpired || session.hasExpired(inOneHour)) {
    try {
        session = await client.sessionRefresh(session);
    } catch (e) {
        session = await client.authenticateDevice(deviceId: deviceId);
    }
}

请求

客户端包含许多内置API用于访问游戏服务器的各种特性,这些请求都需要使用会话对象进行授权。

final account = await client.getAccount(session);
final username = account.user.username;
final avatarUrl = account.user.avatarUrl;
final userId = account.user.id;

套接字通信

客户端可以创建一个或多个与服务器的套接字连接,每个套接字都可以注册自己的事件监听器以接收来自服务器的响应。

NakamaWebsocketClient.init(
    host: '127.0.0.1',
    ssl: false,
    token: _session.token,
);

// 在销毁应用程序小部件后记得关闭连接
NakamaWebsocketClient.instance.close();

示例Demo

以下是一个简单的Flutter应用程序示例,演示了如何使用 Nakama 插件进行登录、注册以及展示一些基本功能。

import 'package:flutter/material.dart';
import 'package:nakama_example/features/authentication/login/views/pages/login_page.dart';
import 'package:nakama_example/features/authentication/signup/views/pages/signup_page.dart';
import 'package:nakama_example/features/home/list_features/views/pages/list_features.dart';
import 'package:nakama_example/features/rpc/custom/views/pages/rpc_custom.dart';

void main() {
  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    routes: {
      '/login': (context) => LoginPage(),
      '/signup': (context) => SignupPage(),
      '/home': (context) => ListFeaturesPage(),
      '/rpc': (context) => RpcCustomPage(),
    },
  ));
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中集成并使用Nakama(一个开源、多用户、实时游戏服务器)的示例代码案例。这个示例将展示如何连接到Nakama服务器、进行用户认证以及执行一个简单的RPC(远程过程调用)。

前提条件

  1. 你已经安装了Flutter开发环境。
  2. 你已经在你的服务器上部署了Nakama服务器。
  3. 你已经获取了Nakama服务器的URL、密钥等配置信息。

步骤

1. 添加依赖

在你的pubspec.yaml文件中添加对nakama-flutter插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  nakama_flutter: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置Nakama客户端

创建一个新的Dart文件(例如nakama_client.dart)来配置和初始化Nakama客户端:

import 'package:nakama_flutter/nakama_flutter.dart';

class NakamaClient {
  late Nakama nakama;

  NakamaClient(String serverKey, String serverUrl) {
    nakama = Nakama(
      serverKey: serverKey,
      serverUrl: serverUrl,
      clientVer: "1.0",  // 客户端版本
      logger: (level, message) {
        // 可以在这里添加日志处理逻辑
        print("$level: $message");
      },
    );
  }

  // 示例:认证用户(邮箱+密码)
  Future<void> authenticateEmail(String email, String password) async {
    try {
      var session = await nakama.authenticateEmail(email: email, password: password);
      print("Authenticated successfully! Session token: ${session.token}");
      // 你可以在这里保存session.token用于后续请求
    } catch (error) {
      print("Authentication failed: $error");
    }
  }

  // 示例:执行RPC
  Future<Rpc> rpcExample(String rpcId, Map<String, dynamic> payload) async {
    try {
      var rpcResponse = await nakama.rpc(id: rpcId, payload: payload);
      return rpcResponse;
    } catch (error) {
      print("RPC failed: $error");
      throw error;
    }
  }
}

3. 使用Nakama客户端

在你的Flutter应用的某个地方(例如main.dart)使用Nakama客户端:

import 'package:flutter/material.dart';
import 'nakama_client.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late NakamaClient nakamaClient;

  @override
  void initState() {
    super.initState();
    // 替换为你的Nakama服务器密钥和URL
    nakamaClient = NakamaClient("your_server_key", "your_server_url");

    // 示例:认证用户
    nakamaClient.authenticateEmail("user@example.com", "password123").then((_) {
      // 认证成功后执行RPC
      nakamaClient.rpcExample("example_rpc", {"key": "value"}).then((rpcResponse) {
        print("RPC response: ${rpcResponse.payload}");
      }).catchError((error) {
        print("Failed to execute RPC: $error");
      });
    }).catchError((error) {
      print("Failed to authenticate: $error");
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Nakama Flutter Example'),
        ),
        body: Center(
          child: Text('Checking authentication and executing RPC...'),
        ),
      ),
    );
  }
}

注意事项

  1. 安全性:不要在客户端代码中硬编码敏感信息,如服务器密钥。在实际应用中,应该使用更安全的方式来管理这些敏感信息。
  2. 错误处理:上面的代码示例中包含了基本的错误处理,但在实际项目中,你可能需要更复杂的错误处理逻辑。
  3. 网络请求:由于网络请求可能会失败,因此你应该考虑在网络请求失败时重试,或者向用户显示适当的错误消息。

希望这个示例能帮助你在Flutter项目中集成和使用Nakama游戏服务器交互插件!

回到顶部