当前位置:网站首页>多语言通信基础 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
边栏推荐
- A blog allows you to learn how to write markdown on vscode
- Swift:Entry of program、Swift调用OC、@_silgen_name 、 OC 调用Swift、dynamic、String、Substring
- 1分钟看懂执行流程,永久掌握for循环(附for循环案例)
- 编程哲学——自动加载、依赖注入与控制反转
- Interviewer: let's talk about the process of class loading and the mechanism of class loading (parental delegation mechanism)
- 51单片机的花卉、农田自动浇水灌溉系统开发,Proteus仿真,原理图和C代码
- QT actual combat: Yunxi calendar
- I/O复用的高级应用:同时处理 TCP 和 UDP 服务
- AT89C51单片机的数字电压表开发,量程0~5V,proteus仿真,原理图PCB和C程序等
- MySQL报错packet out of order
猜你喜欢
基于TLC5615的多路可调数控直流稳压电源,51单片机,含Proteus仿真和C代码等
ASEMI超快恢复二极管与肖特基二极管可以互换吗
单片机的函数信号发生器,输出4种波形,频率可调,原理图,仿真和C程序
金九银十,入职字节跳动那一天,我哭了(蘑菇街被裁,奋战7个月拿下offer)
Mq-2 and DS18B20 fire temperature smoke alarm system design, 51 single chip microcomputer, with simulation, C code, schematic diagram, PCB, etc
UML project example -- UML diagram description of tiktok
基于单片机的DS18B20的数字温度监控报警系统设计【LCD1602显示+Proteus仿真+C程序+论文+按键设置等】
外包干了四年,废了...
外包幹了四年,廢了...
AT89C51 MCU digital voltmeter development, measuring range 0 ~ 5V, proteus simulation, schematic diagram, PCB and C program, etc
随机推荐
《JVM系列》 第七章 -- 字节码执行引擎
DVWA之暴力破解(Brute Force)Low-->high
Use of ansible and common modules
51 MCU + LCD12864 LCD Tetris game, proteus simulation, ad schematic diagram, code, thesis, etc
Logical volume creation and expansion
【无标题】
在游戏世界组建一支AI团队,超参数的多智能体「大乱斗」开赛
LotusDB 设计与实现—1 基本概念
Qt实战:云曦聊天室篇
Mq-2 and DS18B20 fire temperature smoke alarm system design, 51 single chip microcomputer, with simulation, C code, schematic diagram, PCB, etc
Some little records~
面试官:说一下类加载的过程以及类加载的机制(双亲委派机制)
Interviewer: let's talk about the process of class loading and the mechanism of class loading (parental delegation mechanism)
Vous ne connaissez pas encore les scénarios d'utilisation du modèle de chaîne de responsabilité?
关于在vs中使用scanf不安全的问题
金九银十,入职字节跳动那一天,我哭了(蘑菇街被裁,奋战7个月拿下offer)
A blog allows you to learn how to write markdown on vscode
编程哲学——自动加载、依赖注入与控制反转
电容
We reference My97DatePicker to realize the use of time plug-in