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
并配置环境变量
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
项目的目录结构:
评论 (0)