Flutter NATS客户端插件nats_client的使用

Flutter NATS客户端插件nats_client的使用

NATS 是一个开源的消息系统(有时也称为面向消息的中间件)。NATS 服务器是用 Go 编程语言编写的。NATS 客户端通过 NATS 交换系统提供了客户端设备(如 Android、iPhone、iPad、Web 浏览器和桌面应用程序)与服务器之间的通信。它支持使用 SSL/TLS 的安全层协议。

初始化项目

flutter create --project-name nats_client -i objc -a java -t app .

实现

使用 NatsLight 库 (jwt bearer token)

import 'dart:convert';

import 'package:nats_client/natslite/nats.dart';
import 'package:nats_client/natslite/subscription.dart';

// 创建连接
final conn = await Nats.connect(
    opts: { 'servers': server, 'token': token},
    debug: true,
    statusCallback: (status, error) {
      print('$status (${error.toString()})');
    });

// 订阅频道
conn.subscribe('chat', (Result result) {
  print(result.data);
});

// 发布消息
conn.publish('enter', utf8.encode(json.encode({'id': myId})));

使用 JWT 认证

import 'package:nats_client/natslite/nats.dart';
import 'package:nats_client/natslite/constants.dart';
import 'package:nats_client/natslite/subscription.dart';

const token = 'CREATE_USER_TOKEN - nsc add user --bearer --name <n>';

late Nats conn;

// 创建连接
conn = Nats(opts: {}, debug: true,
    statusCallback: (status, error) async {
      if (error != null) {
        print('NetService:ERROR $error');
      }
      if (status == Status.PING_TIMER) {
        print(status.toString());
      } else if (status == Status.CONNECT) {
        // 同步请求
        final msg = await conn.request('/test/notifications', utf8.encode(json.encode({})));
        print(json.decode(utf8.decode(msg)));

        // 订阅频道
        conn.subscribe('/test/notifications/stream', (Result res) {
          print(utf8.decode(res.data));
        });
      }
    });

// 设置 JWT 认证
conn.authenticator.auth = (String nonce) {
  return {'jwt': token, 'nkey': '', 'sig': ''};
};

// 初始化连接
conn.init('wss://{{SERVER}}');

使用 NATS 认证器

使用 JwtAuthenticator

import 'package:nats_client/natslite/nats.dart';
import 'package:nats_client/nats/jwtauth.dart';

final conn = await Nats.connect(
    opts: { 'servers': server },
    authenticator: JwtAuthenticator(token),
    // 其他配置项
);

使用 UserAuthenticator

import 'package:nats_client/natslite/nats.dart';
import 'package:nats_client/nats/userauth.dart';

final conn = await Nats.connect(
    opts: { 'servers': server },
    authenticator: UserAuthenticator(login_auth_token),
    // 其他配置项
);

使用 NKeyAuthenticator

import 'package:nats_client/natslite/nats.dart';
import 'package:nats_client/nats/userauth.dart';

final conn = await Nats.connect(
    opts: { 'servers': server },
    authenticator: NKeyAuthenticator('SUAOMTSAOJJNB5TIPMYC5W2OMXDS6ST3Z3PDLDJHCMTGV7SKWVPDL2OU3Y'),
    // 其他配置项
);

使用 CredsAuthenticator

import 'package:nats_client/natslite/nats.dart';
import 'package:nats_client/nats/credauth.dart';

final conn = await Nats.connect(
    opts: { 'servers': server },
    authenticator: CredsAuthenticator(certificate),
    // 其他配置项
);

安装 NGS 和 NSC 工具

下载并安装工具

$ curl https://downloads.synadia.com/ngs/install.py -sSf | python

这将把 nscngs 工具安装到 ~/.nsc/bin 目录下。可以通过执行 ngs -hnsc -h 来获取帮助信息。

配置 NSC 并创建账户

$ nsc init -o synadia -n First

验证生成的环境变量、JWT、账户、用户和密钥

nsc env

nsc describe jwt  -f ~/.local/share/nats/nsc/stores/synadia/synadia.jwt

nsc describe account    or    nsc list accounts

nsc describe user    or    nsc list users

tree ~/.local/share/nats/nsc/keys/keys    or    nsc list keys 
        (Where Account Key: nsc list keys -a)
        (Where User Key: nsc list keys -u)

ngs status -d ~/.local/share/nats/nsc/stores/synadia
 &gt; Other... (ENTER)
 path to signer account nkey or nkey  ~/.local/share/nats/nsc/keys/keys/A/{KEY_DIR}/KEY_NAME.nk

切换到开发者计划

ngs edit -d ~/.local/share/nats/nsc/stores/synadia/
 &gt; Other... (ENTER)
 path to signer account nkey or nkey  ~/.local/share/nats/nsc/keys/keys/A/{KEY_DIR}/KEY_NAME.nk
 &gt; Developer $0.00/month
 ? Email
 &gt; OK

安装 NATS 服务器

下载 NATS 服务器

https://nats.io/download/

创建服务器配置文件

nsc generate config --mem-resolver --config-file {DIR_PATH}/nsc-server.conf 

启动服务器

nats-server -c {DIR_PATH}/nsc-server.conf 

更多关于Flutter NATS客户端插件nats_client的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter NATS客户端插件nats_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用nats_client插件的示例代码。这个插件允许你与NATS消息系统进行交互。NATS是一个高性能的简单消息队列系统,用于在分布式系统中传递消息。

首先,确保你已经在pubspec.yaml文件中添加了nats_client依赖:

dependencies:
  flutter:
    sdk: flutter
  nats_client: ^最新版本号  # 请替换为当前可用的最新版本号

然后,运行flutter pub get来获取依赖。

接下来是一个简单的Flutter应用示例,它展示了如何连接到NATS服务器、订阅主题并发布消息。

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

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

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

class _MyAppState extends State<MyApp> {
  String _status = 'Not connected';
  String _receivedMessage = '';

  @override
  void initState() {
    super.initState();
    _connectToNATS();
  }

  void _connectToNATS() async {
    try {
      // 创建一个NATS连接选项
      var options = ConnectionOptions(
        servers: ['nats://localhost:4222'],  // 替换为你的NATS服务器地址
      );

      // 创建NATS连接
      var connection = await connect(options);

      setState(() {
        _status = 'Connected to NATS';
      });

      // 订阅主题
      var subscription = await connection.subscribe('test_subject', (msg) {
        setState(() {
          _receivedMessage = msg.data.toString();
        });
      });

      // 发布消息
      connection.publish('test_subject', 'Hello NATS from Flutter!'.codeUnits);

      // 为了保持连接活跃,这里我们简单地延迟一段时间,实际应用中你可能会有其他逻辑
      await Future.delayed(Duration(seconds: 10));

      // 断开连接
      await subscription.unsubscribe();
      await connection.close();
      setState(() {
        _status = 'Disconnected from NATS';
      });
    } catch (e) {
      print('Error connecting to NATS: $e');
      setState(() {
        _status = 'Error connecting to NATS';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter NATS Client Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('Status: $_status'),
              SizedBox(height: 16),
              Text('Received Message: $_receivedMessage'),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 创建一个NATS连接选项,指定NATS服务器的地址。
  2. 使用connect函数创建一个NATS连接。
  3. 订阅一个名为test_subject的主题,并在接收到消息时更新UI。
  4. 发布一条消息到test_subject主题。
  5. 为了保持连接活跃(在实际应用中,你可能会有其他机制来管理连接),我们延迟了10秒,然后取消了订阅并关闭了连接。
  6. 更新UI以显示连接状态和接收到的消息。

请注意,这个示例代码是为了演示目的而简化的。在实际应用中,你可能需要更复杂的错误处理和资源管理逻辑。此外,确保你的NATS服务器正在运行,并且地址和端口配置正确。

回到顶部