流模式定义
这里实现的是客户端流,所以给入参stream标识
syntax = "proto3";
option go_package = "./;streampb";
message StreamReqData{
string data = 1;
}
message StreamResData{
string data = 1;
}
service Greeter {
rpc PutStream(stream StreamReqData) returns (StreamResData);
}
代码生成
protoc -I . stream.proto --go_out=plugins=grpc:.
服务端实现
和一元rpc差不多,只不过服务端的入参不同,客户端流模模式下的入参(Greeter_PutStreamServer)提供Recv接受数据
入参的名称 = proto中 rpc服务名 + “_” + prc方法名 + server
package main
import (
streampb "Study/Five/pro"
"fmt"
"google.golang.org/grpc"
"net"
)
type service struct {
}
func (s *service) PutStream(request streampb.Greeter_PutStreamServer) error {
for {
if res, err := request.Recv(); err == nil {
fmt.Println(res.Data)
}
}
return nil
}
func main() {
server := grpc.NewServer()
streampb.RegisterGreeterServer(server, &service{})
listen, _ := net.Listen("tcp", ":8088")
server.Serve(listen)
}
客户端实现
和一元rpc差不多,只不过返回的参数提供Send方法发送数据
package main
import (
streampb "Study/Five/pro"
"context"
"fmt"
"google.golang.org/grpc"
"time"
)
func main() {
dial, _ := grpc.Dial(":8088", grpc.WithInsecure())
client := streampb.NewGreeterClient(dial)
stream, err := client.PutStream(context.Background())
if err != nil {
panic(err)
}
count := 0
for {
count++
time.Sleep(time.Second)
stream.Send(&streampb.StreamReqData{
Data: fmt.Sprintf("%d", count),
})
}
}
运行结果