当前位置:网站首页>多语言通信基础 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
边栏推荐
- Eight way responder system 51 Single Chip Microcomputer Design [with Proteus simulation, C program, schematic diagram, PCB files, component list and papers, etc.]
- vscode中文插件不生效问题解决
- 3、 Gradient descent solution θ
- UML项目实例——抖音的UML图描述
- PCIe X1 插槽的主要用途是什么?
- 电容
- L'externalisation a duré quatre ans.
- 8.2 文本预处理
- epoll 的 ET,LT工作模式———实例程序
- Matlab Simulink modeling and design of single-phase AC-AC frequency converter, with MATLAB simulation, PPT and papers
猜你喜欢

c语言在结构体传参时参数压栈问题

capacitance

ASEMI整流模块MDQ100-16在智能开关电源中的作用

Want to be an architect? Tamping the foundation is the most important

SHT11传感器的温度湿度监控报警系统单片机Proteus设计(附仿真+论文+程序等)

Chapter 7 of JVM series -- bytecode execution engine

基于TLC5615的多路可调数控直流稳压电源,51单片机,含Proteus仿真和C代码等

利用 MATLAB 编程实现最速下降法求解无约束最优化问题

C语言知识点精细详解——初识C语言【1】——你不能不知的VS2022调试技巧及代码实操【2】

剑指 Offer II 019. 最多删除一个字符得到回文(简单)
随机推荐
【NLP】HMM隐马尔可夫+维特比分词
redis的五种数据类型
Swift:Entry of program、Swift调用OC、@_silgen_name 、 OC 调用Swift、dynamic、String、Substring
科技的成就(二十一)
DVWA之暴力破解(Brute Force)Low-->high
Swift - Literal,字面量协议,基本数据类型、dictionary/array之间的转换
【STC8G2K64S4】比较器介绍以及比较器掉电检测示例程序
SVN详细使用教程
拼接hql时,新增字段没有出现在构造方法中
单相交交变频器的Matlab Simulink建模设计,附Matlab仿真、PPT和论文等资料
L'externalisation a duré quatre ans.
UML project example -- UML diagram description of tiktok
epoll 的 ET,LT工作模式———实例程序
单片机的函数信号发生器,输出4种波形,频率可调,原理图,仿真和C程序
1 - first knowledge of go language
Raised exception class eaccexviolation with 'access violation at address 45efd5 in module error
《JVM系列》 第七章 -- 字节码执行引擎
Arduino for esp8266串口功能简介
MDS55-16-ASEMI整流模块MDS55-16
First acquaintance with STL