当前位置:网站首页>多语言通信基础 06 go实现grpc的四种数据流模式实现
多语言通信基础 06 go实现grpc的四种数据流模式实现
2022-04-23 14:41:00 【一越王超】
grpc的数据传输模式有多种:
- 简单模式:客户端发起一次请求,服务端响应一次数据,和普通的rpc没有区别。
- 服务端数据流模式:客户端发起一次请求,服务端返回一段连续的数据流。典型的例子是客户端发给服务端一个股票代码,服务端将该股票的数据实时不断的返回给客户端。还有我们常用的订阅场景也属于服务端流模式。
- 客户端数据流模式。与服务端数据流模式相反,由客户端源源不断的像服务端发送数据流,发送结束后,由服务端返回一个响应。典型的例子是物联网终端像服务器报送数据。
- 双向数据流模式:客户端和服务端可以向双方实时发送数据流进行交互,典型应用是聊天机器人,即时通信工具等。
propto文件
各种模式的proto文件内容如下:
syntax = "proto3";
option go_package = ".;proto"; // 指明当前目录
service Greeter {
rpc GetStream(StreamReqData)returns(stream StreamResData); //服务端流模式
rpc PutStream(stream StreamReqData)returns(StreamResData); //客户端流模式
rpc Al1Stream(stream StreamReqData)returns(stream StreamResData); //双向流模式
}
message StreamReqData {
string data = 1;
}
message StreamResData {
string data = 1;
}
serve服务端程序
服务端必须实现proto中的三个函数。
package main
import (
"OldPackageTest/stream_grpc_test/proto"
"fmt"
"google.golang.org/grpc"
"net"
"sync"
"time"
)
const PORT = ":50052"
type server struct {
}
// 服务端流模式
func (s *server) GetStream(req *proto.StreamReqData, res proto.Greeter_GetStreamServer) error {
i := 0
for {
i++
_ = res.Send(&proto.StreamResData{
Data: fmt.Sprintf("%v", time.Now().Unix()),
})
time.Sleep(time.Second)
if i > 10 {
break
}
}
return nil
}
// 客户端流模式
func (s *server) PutStream(cliStr proto.Greeter_PutStreamServer) error {
for {
if a, err := cliStr.Recv(); err != nil {
fmt.Println(err)
break
} else {
fmt.Println(a.Data)
}
}
return nil
}
// 双向流模式
func (s *server) AllStream(allStr proto.Greeter_AllStreamServer) error {
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
for {
data, _ := allStr.Recv()
fmt.Println("收到客户端消息:" + data.Data)
}
}()
go func() {
defer wg.Done()
for {
_ = allStr.Send(&proto.StreamResData{Data: "我是服务器"})
time.Sleep(time.Second)
}
}()
wg.Wait()
return nil
}
func main() {
lis, err := net.Listen("tcp", PORT)
if err != nil {
panic(err)
}
s := grpc.NewServer()
proto.RegisterGreeterServer(s, &server{})
err = s.Serve(lis)
if err != nil {
panic(err)
}
}
client客户端程序
package main
import (
"context"
"fmt"
"sync"
"time"
"google.golang.org/grpc"
"OldPackageTest/stream_grpc_test/proto"
)
func main() {
conn, err := grpc.Dial("localhost:50052", grpc.WithInsecure())
if err != nil {
panic(err)
}
defer conn.Close()
//服务端流模式
c := proto.NewGreeterClient(conn)
res, _ := c.GetStream(context.Background(), &proto.StreamReqData{Data: "慕课网"})
for {
a, err := res.Recv() //如果大家懂socket编程的话就明白 send recv
if err != nil {
fmt.Println(err)
break
}
fmt.Println(a.Data)
}
//客户端流模式
putS, _ := c.PutStream(context.Background())
i := 0
for {
i++
_ = putS.Send(&proto.StreamReqData{
Data: fmt.Sprintf("慕课网%d", i),
})
time.Sleep(time.Second)
if i > 10 {
break
}
}
//双向流模式
allStr, _ := c.AllStream(context.Background())
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
for {
data, _ := allStr.Recv()
fmt.Println("收到客户端消息:" + data.Data)
}
}()
//1. 集中学习protobuf, grpc
go func() {
defer wg.Done()
for {
_ = allStr.Send(&proto.StreamReqData{Data: "慕课网"})
time.Sleep(time.Second)
}
}()
wg.Wait()
}
版权声明
本文为[一越王超]所创,转载请带上原文链接,感谢
https://yiyuewangchao.blog.csdn.net/article/details/124338828
边栏推荐
- source insight via samba
- ArrayList collection basic usage
- 数组模拟队列进阶版本——环形队列(真正意义上的排队)
- The art of automation
- MySQL报错packet out of order
- Branch statement of process control
- MCU function signal generator, output four kinds of waveforms, adjustable frequency, schematic diagram, simulation and C program
- UML项目实例——抖音的UML图描述
- 基于TLC5615的多路可调数控直流稳压电源,51单片机,含Proteus仿真和C代码等
- 【NLP】HMM隐马尔可夫+维特比分词
猜你喜欢

三、梯度下降求解最小θ

AT89C52 MCU frequency meter (1Hz ~ 20MHz) design, LCD1602 display, including simulation, schematic diagram, PCB and code, etc

外包幹了四年,廢了...

电子秤称重系统设计,HX711压力传感器,51单片机(Proteus仿真、C程序、原理图、论文等全套资料)

【工厂模式详解】工厂方法模式

we引用My97DatePicker 实现时间插件使用

51 MCU flowers, farmland automatic irrigation system development, proteus simulation, schematic diagram and C code

DS1302的电子万年历_51单片机,年月日、星期、时分秒、农历和温度,带闹钟,全套资料

Model location setting in GIS data processing -cesium

机器学习之逻辑回归(Logistic Regression)原理讲解和实例应用,果断收藏
随机推荐
AT89C51 MCU digital voltmeter development, measuring range 0 ~ 5V, proteus simulation, schematic diagram, PCB and C program, etc
8.4 循环神经网络从零实现
we引用My97DatePicker 实现时间插件使用
拼接hql时,新增字段没有出现在构造方法中
On the insecurity of using scanf in VS
你还不知道责任链模式的使用场景吗?
Qt实战:云曦聊天室篇
编程哲学——自动加载、依赖注入与控制反转
帧同步 实现
Qt界面优化:鼠标双击特效
Solve the problem of SSH configuration file optimization and slow connection
L'externalisation a duré quatre ans.
epoll 的 ET,LT工作模式———实例程序
流程控制之分支语句
Qt实战:云曦日历篇
电容
Qt界面优化:Qt去边框与窗体圆角化
do(Local scope)、初始化器、内存冲突、Swift指针、inout、unsafepointer、unsafeBitCast、successor、
select 同时接收普通数据 和 带外数据
【Proteus仿真】自动量程(范围<10V)切换数字电压表