Flutter NATS客户端插件dart_nats的使用

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

Flutter NATS客户端插件dart_nats的使用

dart_nats 是一个用于 Dart 和 Flutter 的 NATS 消息系统的客户端库。它支持多种连接方式,包括 WebSocket 和 TCP Socket,并且支持各种认证机制。

支持的功能

  • 发布消息
  • 订阅和取消订阅
  • NUID 和 Inbox
  • 连接丢失时自动重连并恢复订阅
  • 订阅后接收N条消息后自动取消订阅
  • 请求/响应模式
  • 队列订阅
  • 请求超时
  • 事件/状态
  • 在尝试重新连接期间缓冲消息
  • 所有认证模型,包括 NATS 2.0 JWT 和 nkey
  • TLS 支持

示例代码

基本示例

import 'package:dart_nats/dart_nats.dart';

void main() async {
  var client = Client();
  await client.connect(Uri.parse('ws://localhost:80'));
  var sub = client.sub('subject1');
  client.pubString('subject1', 'message1');
  var data = await sub.stream.first;

  print(data.string);
  client.unSub(sub);
  await client.close();
}

Flutter 示例

导入并声明对象
import 'package:dart_nats/dart_nats.dart' as nats;

nats.Client natsClient;
nats.Subscription fooSub, barSub;
连接到服务器并订阅主题
void connect() {
  natsClient = nats.Client();
  natsClient.connect(Uri.parse('nats://hostname'));
  fooSub = natsClient.sub('foo');
  barSub = natsClient.sub('bar');
}
使用 StreamBuilder 显示消息
StreamBuilder(
  stream: fooSub.stream,
  builder: (context, AsyncSnapshot<nats.Message> snapshot) {
    return Text(snapshot.hasData ? '${snapshot.data.string}' : '');
  },
),
发布消息
await natsClient.pubString('subject', 'message string');
发送请求
var client = Client();
client.inboxPrefix = '_INBOX.test_test';
await client.connect(Uri.parse('nats://localhost:4222'));
var receive = await client.request(
    'service', Uint8List.fromList('request'.codeUnits));
结构化请求
var client = Client();
await client.connect(Uri.parse('nats://localhost:4222'));
client.registerJsonDecoder<Student>(json2Student);
var receive = await client.requestString<Student>('service', '');
var student = receive.data;

Student json2Student(String json) {
  return Student.fromJson(jsonDecode(json));
}
断开连接
void dispose() {
  natsClient.close();
  super.dispose();
}

认证

Token 认证
var client = Client();
client.connect(Uri.parse('nats://localhost'),
          connectOption: ConnectOption(authToken: 'mytoken'));
用户名/密码认证
var client = Client();
client.connect(Uri.parse('nats://localhost'),
          connectOption: ConnectOption(user: 'foo', pass: 'bar'));
NKEY 认证
var client = Client();
client.seed =
    'SUACSSL3UAHUDXKFSNVUZRF5UHPMWZ6BFDTJ7M6USDXIEDNPPQYYYCU3VY';
client.connect(
  Uri.parse('nats://localhost'),
  connectOption: ConnectOption(
    nkey: 'UDXU4RCSJNZOIQHZNWXHXORDPRTGNJAHAHFRGZNEEJCPQTT2M7NLCNF4',
  ),
);
JWT 认证
var client = Client();
client.seed =
    'SUAJGSBAKQHGYI7ZVKVR6WA7Z5U52URHKGGT6ZICUJXMG4LCTC2NTLQSF4';
client.connect(
  Uri.parse('nats://localhost'),
  connectOption: ConnectOption(
    jwt:
        '''eyJ0eXAiOiJKV1QiLCJhbGciOiJlZDI1NTE5LW5rZXkifQ.eyJqdGkiOiJBU1pFQVNGMzdKS0dPTFZLTFdKT1hOM0xZUkpHNURJUFczUEpVT0s0WUlDNFFENlAyVFlRIiwiaWF0IjoxNjY0NTI0OTU5LCJpc3MiOiJBQUdTSkVXUlFTWFRDRkUzRVE3RzVPQldSVUhaVVlDSFdSM0dRVERGRldaSlM1Q1JLTUhOTjY3SyIsIm5hbWUiOiJzaWdudXAiLCJzdWIiOiJVQzZCUVY1Tlo1V0pQRUVZTTU0UkZBNU1VMk5NM0tON09WR01DU1VaV1dORUdZQVBNWEM0V0xZUCIsIm5hdHMiOnsicHViIjp7fSwic3ViIjp7fSwic3VicyI6LTEsImRhdGEiOi0xLCJwYXlsb2FkIjotMSwidHlwZSI6InVzZXIiLCJ2ZXJzaW9uIjoyfX0.8Q0HiN0h2tBvgpF2cAaz2E3WLPReKEnSmUWT43NSlXFNRpsCWpmkikxGgFn86JskEN4yast1uSj306JdOhyJBA''',
  ),
);

完整 Flutter 示例代码

你可以参考 GitHub 上的完整示例 获取更详细的实现。

通过这些示例,你可以在 Flutter 应用中轻松集成 NATS 消息系统,并利用其强大的功能来构建实时通信应用。


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

1 回复

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


当然,以下是一个使用 dart_nats 插件在 Flutter 中与 NATS 服务器进行通信的代码示例。dart_nats 是一个 Dart 客户端库,用于与 NATS 消息系统进行交互。请注意,为了运行以下代码,你需要确保已经添加了 dart_nats 依赖到你的 pubspec.yaml 文件中。

pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  dart_nats: ^x.y.z  # 请使用最新版本号替换 x.y.z

Dart 代码示例

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter NATS Client'),
        ),
        body: Center(
          child: NATSClientDemo(),
        ),
      ),
    );
  }
}

class NATSClientDemo extends StatefulWidget {
  @override
  _NATSClientDemoState createState() => _NATSClientDemoState();
}

class _NATSClientDemoState extends State<NATSClientDemo> {
  String? messageFromNATS;

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

  void connectToNATS() async {
    // 配置NATS连接
    var options = NatsOptions()
      ..servers = ["nats://localhost:4222"]  // 替换为你的NATS服务器地址
      ..credentials = Credentials("user", "password");  // 如果需要认证,请提供用户名和密码

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

    // 订阅一个主题
    var subscription = await connection.subscribe("my_subject", (msg) {
      // 当接收到消息时,更新UI
      setState(() {
        messageFromNATS = String.fromCharCodes(msg.data);
      });
    });

    // 发布一条消息到主题
    await connection.publish("my_subject", "Hello from Flutter!".codeUnits);

    // 在真实应用中,你可能需要在某处关闭连接和订阅
    // subscription.unsubscribe();
    // await connection.close();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text(
          "Message from NATS: ${messageFromNATS ?? 'Waiting for message...'}",
          style: TextStyle(fontSize: 20),
        ),
      ],
    );
  }
}

注意事项

  1. 依赖管理:确保在 pubspec.yaml 中添加了 dart_nats 依赖,并运行 flutter pub get

  2. NATS 服务器:确保 NATS 服务器正在运行,并且可以通过指定的地址和端口访问。如果 NATS 服务器需要认证,请确保提供了正确的用户名和密码。

  3. UI 更新:由于 NATS 消息接收是异步操作,我们使用 setState 方法来更新 UI,以显示接收到的消息。

  4. 资源管理:在实际应用中,你应该在适当的时机关闭连接和订阅,以释放资源。上面的代码示例中,这部分被注释掉了,但你应该根据应用的需求来管理这些资源。

  5. 错误处理:上面的代码没有包含错误处理逻辑。在实际应用中,你应该添加适当的错误处理,以处理连接失败、订阅失败等情况。

这个示例展示了如何使用 dart_nats 插件在 Flutter 应用中与 NATS 消息系统进行基本的发布和订阅操作。根据你的需求,你可以进一步扩展这个示例。

回到顶部