新闻中心
Golang如何使用gRPC双向流进行通信_Golang gRPC双向流通信实践
双向流通信模式支持客户端和服务器持续互发消息,适用于聊天系统等实时场景。通过在.proto文件中使用stream关键字定义请求和响应类型,实现双方全双工通信;利用protoc生成Go代码后,服务端和客户端分别通过Recv()和Send()方法在循环中处理消息收发,可扩展为广播或多用户交互系统。

gRPC 支持四种通信模式,其中双向流(Bidirectional Streaming)是最灵活的一种。在这种模式下,客户端和服务器都可以连续发送多个消息,彼此独立读写,适用于实时通信场景,比如聊天系统、实时数据推送等。
定义双向流的 Protobuf 接口
要使用 gRPC 双向流,首先要定义服务接口。在 .proto 文件中,使用 stream 关键字标记请求和响应类型:
syntax = "proto3"; package chat; service ChatService { rpc ChatStream(stream Message) returns (stream Message); } message Message { string user =
1;
string content = 2;
}
这里 ChatStream 方法接收一个消息流,并返回一个消息流,表示客户端和服务器都能持续发送和接收消息。
生成 gRPC 代码
使用 protoc 和插件生成 Go 代码:
protoc --go_out=. --go-grpc_out=. chat.proto会生成两个文件:chat.pb.go 和 chat_grpc.pb.go,包含服务接口和数据结构定义。
实现服务端逻辑
服务端需要实现生成的接口,在流中循环读取客户端消息,同时可以随时发送消息:
GoEnhance
全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。
347
查看详情
func (s *ChatServer) ChatStream(stream pb.ChatService_ChatStreamServer) error {
for {
msg, err := stream.Recv()
if err != nil {
return err
}
// 处理消息并广播给所有连接的客户端(简化为回写)
response := &pb.Message{
User: "server",
Content: "echo: " + msg.Content,
}
if err := stream.Send(response); err != nil {
return err
}
}
}
实际应用中可维护一个客户端连接池,实现群聊或广播功能。
实现客户端逻辑
客户端同样通过流发送和接收消息:
conn, _ := grpc.Dial("localhost:50051", grpc.WithInsecure()) client := pb.NewChatServiceClient(conn) stream, _ := client.ChatStream(context.Background()) // 启动 goroutine 接收服务器消息 go func() { for { msg, err := stream.Recv() if err != nil { log.Fatal(err) } log.Printf("%s: %s", msg.User, msg.Content) } }() // 发送消息 for i := 1; i注意:接收消息必须放在独立 goroutine 中,避免阻塞发送。
运行与测试
启动服务端监听,再运行多个客户端,即可看到双向通信效果。每个客户端发送的消息会被服务端处理并返回,客户端也能实时接收到服务器推送的内容。
基本上就这些。双向流的核心在于并发控制和连接管理,理解好 Send 和 Recv 的使用时机,就能构建出高效的实时通信系统。
以上就是Golang如何使用gRPC双向流进行通信_Golang gRPC双向流通信实践的详细内容,更多请关注其它相关文章!
# 放在
# 昌平区网站建设费用
# 营销推广协议合同模板
# 天津电商网站建设优势
# 营销产品如何帮上热门推广
# 怎么推广我刚建立的网站
# 温州seo免费咨询
# 商务网站建设哪家优惠好
# 天河正规头条seo
# 许昌建设用地转让网站
# 铁岭网络推广seo
# 就能
# go
# 发送消息
# 适用于
# 多个
# 如何使用
# 数据结构
# 服务端
# 流进
# 客户端
# stream
# golang
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
iwriter统一登录平台 iwrite账号密码登录页面
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】
mcjs网页版流畅运行 mcjs低配电脑畅玩入口
css链接悬停下划线样式如何自定义_使用::after结合content和transition
如何在 Excel Online 和 Google 表格中更改日期格式
晋江读书网页版在线登录 晋江读书电脑版官网
格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施
实现全屏滚动与导航点:专业教程
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法
TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程
如何将HTML表格多行数据保存到Google Sheets
Go语言中动态执行代码字符串的策略与实践
Python实现多节点属性重叠度分析教程
拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
红果短剧网页版官网入口 官方最新网址发布
提升Kafka消费者健壮性:会话超时处理与消息处理语义
BetterDiscord插件中安全更新用户简介的实践指南
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法
葱吃多了会怎样 葱吃多了会伤胃吗
QQ邮箱正确登录入口_QQ邮箱官方网站使用地址
《刺客信条:影》PS5 Pro和Switch 2画面对比
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
将HTML动态表格多行数据保存到Google Sheet的教程
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
响应式图片在网页设计中的正确实现方法
sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
AO3官方镜像站点汇总 AO3同人作品网页版直达链接
《GTA6》开发画面疑似泄露!这次可不是AI了
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
修复二维数组索引越界异常:一维循环到二维坐标的正确映射
J*aScript教程:根据元素文本内容动态设置背景色
css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异
QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道
“在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法
c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学
qq游戏跨平台入口_qq游戏多设备同步登录
PHP 枚举:根据字符串获取枚举案例的策略与实现
使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战
AO3最新官网入口公告_2025AO3镜像站实时查询方法
LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别
俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航
Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】
Excel文件在线转换快速入口 Excel在线格式转换网站


2025-12-01
浏览次数:次
返回列表