dart使用grpc

尽意
2024-09-21 / 0 评论 / 30 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年09月21日,已超过123天没有更新,若内容或图片失效,请留言反馈。
1.添加依赖项: 在你的 pubspec.yaml 文件中,添加 gRPC 和 protobuf 的依赖:
dependencies:
  protobuf: ^3.1.0
  grpc: ^4.0.1
2.安装 Dart 的 protoc_plugin

protoc_plugin 是 Dart 的 gRPC 插件,它可以将 .proto 文件编译为 Dart 代码。通过 Dart 的包管理工具 pub 来安装:

dart pub global activate protoc_plugin

并配置环境变量
m1c7zytd.png

3.生成 Protocol Buffers 代码: 创建一个 .proto 文件,定义服务和消息

hello.proto

syntax = "proto3";

package hello;

service Hello {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
4.使用 protoc 生成 Dart 代码
protoc --dart_out=grpc:lib/src/generated -I. lib/protos/hello.proto
  • --dart_out=grpc:lib/src/generated:生成带 gRPC 支持的 Dart 文件,并将其放入 lib/src/generated 目录。
  • -I .:指定 .proto 文件的路径(.表示当前目录)。
  • lib/protos/hello.proto:指定你要编译的 .proto 文件。
5.编写客户端代码

client.dart

import 'package:grpc/grpc.dart';
import 'generated/protos/hello.pb.dart';        // 引入生成的消息定义
import 'generated/protos/hello.pbgrpc.dart';    // 引入生成的 gRPC 客户端和服务



Future<void> main() async {
  // 创建一个 gRPC 客户端连接到服务端,假设服务端在本地的 50051 端口
  final channel = ClientChannel(
    'localhost',
    port: 50051,
    options: const ChannelOptions(credentials: ChannelCredentials.insecure()),
  );

  final client = HelloClient(channel);

  try {
    // 调用 sayHello 并打印响应
    for(int i = 0;i<10;i++) {
      final response = await client.sayHello(HelloRequest()
        ..name = "hello grpc$i");
      print('Received: $response');
    }
  } finally {
    // 关闭客户端通道
    await channel.shutdown();
  }
}
6.编写服务端代码

server.dart

import 'package:grpc/grpc.dart';
import 'generated/protos/hello.pb.dart';
import 'generated/protos/hello.pbgrpc.dart';

// 实现 Hello 服务
class HelloService extends HelloServiceBase {
  @override
  Future<HelloReply> sayHello(ServiceCall call, HelloRequest request) async {
    print("server message:${request.name}");
    // 构建响应
    return HelloReply()..message = 'Hello, ${request.name}!';
  }
}

Future<void> main() async {
  // 启动 gRPC 服务端
  final server = Server.create(services: [HelloService()]);
  await server.serve(port: 50051);
  print('Server listening on port ${server.port}...');
}
7.运行代码

运行服务端

dart run lib/src/server.dart

运行客户端

dart run lib/src/client.dart

项目的目录结构:
m1c8apa1.png

2

评论 (0)

取消