grpc服务器主动推送数据
时间: 2024-03-27 21:10:20 浏览: 95
对于 gRPC服务器主动推送数据,可以使用服务器端流式 RPC(Server Streaming RPC)来实现。在 gRPC 中,服务器端流式 RPC 允许服务器在单个请求中流式传输多个响应消息给客户端。
以下是一个简单的示例代码,展示了如何在 gRPC服务器端主动推送数据给客户端:
服务定义(.proto 文件):
```protobufsyntax = "proto3";
service MyService {
rpc PushData(DataRequest) returns (stream DataResponse) {}
}
message DataRequest {
// 可选的请求字段}
message DataResponse {
string data =1;
}
```
服务器端实现(使用 gRPC 的 Go语言示例):
```gopackage mainimport (
"context"
"log"
"net"
"google.golang.org/grpc"
)
type myServer struct{}
func (s *myServer) PushData(req *pb.DataRequest, stream pb.MyService_PushDataServer) error {
// 在这里可以根据需要生成响应数据,并通过流式发送给客户端 for i :=0; i <10; i++ {
resp := &pb.DataResponse{
Data: "Data " + strconv.Itoa(i),
}
if err := stream.Send(resp); err != nil {
return err }
}
return nil}
func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterMyServiceServer(s, &myServer{})
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
```
客户端实现(使用 gRPC 的 Go语言示例):
```gopackage mainimport (
"context"
"log"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
client := pb.NewMyServiceClient(conn)
req := &pb.DataRequest{}
stream, err := client.PushData(context.Background(), req)
if err != nil {
log.Fatalf("error calling PushData: %v", err)
}
for {
resp, err := stream.Recv()
if err == io.EOF {
break }
if err != nil {
log.Fatalf("error receiving response: %v", err)
}
log.Printf("Received data: %s", resp.Data)
}
}
```
上述示例中,服务器端实现了 `PushData` 方法,该方法返回一个 `stream DataResponse`,在方法内部通过循环向客户端发送多个响应消息。客户端通过调用 `PushData` 方法获取到一个 `stream DataResponse`,然后通过循环调用 `Recv` 方法来接收服务器端发送的多个响应消息。
这样,服务器就可以主动推送数据给客户端了。
阅读全文