Golang rpc 客户端流模式

流模式定义
这里实现的是客户端流,所以给入参stream标识
syntax = "proto3";

option go_package = "./;streampb";

message StreamReqData{
  string data = 1;
}

message StreamResData{
  string data = 1;
}

//流需要stream 标识
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),
		})
	}
}


运行结果

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值