定义.proto文件中的双向流方法:使用stream关键字声明输入和输出流,如rpc Chat(stream Message) returns (stream Message);2. 生成Go代码:通过protoc命令配合插件生成chat.pb.go和chat_grpc.pb.go文件;3. 实现服务端逻辑:在循环中调用Recv()接收客户端消息,并用Send()回传消息;4. 编写客户端代码:通过goroutine分离接收与发送逻辑,实现并发通信。该模式适用于实时聊天、监控等需持续交互的场景。

在Go语言中实现gRPC双向流通信,核心在于定义一个返回和接收都是流式的数据接口。这种方式适用于客户端和服务端需要持续交换数据的场景,比如实时聊天、日志推送或监控系统。
要启用双向流,必须在.proto文件中声明一个stream输入和stream输出的方法。例如:
syntax = "proto3";
package chat;
service ChatService {
rpc Chat(stream Message) returns (stream Message);
}
message Message {
string content = 1;
string sender = 2;
}
这里的Chat方法接受一个消息流,并返回一个消息流,表示客户端和服务端都可以持续发送消息。
使用protoc配合gRPC插件生成Go代码:
protoc-gen-go和protoc-gen-go-grpc
protoc --go_out=. --go-grpc_out=. chat.proto
会生成chat.pb.go和chat_grpc.pb.go两个文件,包含服务接口和数据结构。
服务端通过读取客户端的流并同时向其写入数据来实现双向通信:
标贝悦读AI配音
在线文字转语音软件-专业的配音网站
66
查看详情
func (s *ChatServer) Chat(stream chat.ChatService_ChatServer) error {
for {
msg, err := stream.Recv()
if err != nil {
return err
}
// 处理收到的消息
log.Printf("Received: %s from %s", msg.Content, msg.Sender)
// 回复消息(也可以广播给其他客户端)
response := &chat.Message{
Content: "Echo: " + msg.Content,
Sender: "server",
}
if err := stream.Send(response); err != nil {
return err
}
}
}
Recv()用于接收客户端消息,Send()用于向客户端发送消息,二者可在同一个循环中交替调用。
客户端同样使用流进行收发:
client := chat.NewChatServiceClient(conn)
stream, _ := client.Chat(context.Background())
// 开启goroutine接收服务端消息
go func() {
for {
msg, err := stream.Recv()
if err != nil {
log.Fatal(err)
}
log.Printf("Server: %s", msg.Content)
}
}()
// 发送消息
for i := 0; i < 5; i++ {
stream.Send(&chat.Message{
Content: fmt.Sprintf("Hello %d", i),
Sender: "client",
})
time.Sleep(time.Second)
}
注意:客户端也需要用独立的goroutine处理接收,避免阻塞发送逻辑。
基本上就这些。只要.proto定义正确,服务端和客户端都使用stream.Send()和stream.Recv(),就能实现完整的双向通信。这种模式灵活高效,适合高频率小数据量的实时交互场景。
以上就是Golang如何实现gRPC双向流通信的详细内容,更多请关注其它相关文章!
# 流进
# 南通购物商城网站建设
# 永川尖山村营销推广公司
# 珠海网站建设模拟
# 天河关键词排名推广
# 企业网站怎么推广好做的
# seo优选16火星
# 网站优化排名哪家信誉好
# 抖音小店seo如何优化
# 临淄网站建设工具
# 上海宝山网站建设开发
# 就能
# 都是
# go
# 发送消息
# 适用于
# 如何实现
# 器中
# 数据结构
# 服务端
# 客户端
# 实时聊天
# stream
# go语言
# golang
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
精通VS Code多光标编辑以实现闪电般快速的修改
汽水音乐网页版登录 汽水音乐网页端官方入口
申通快件单号查询平台 申通包裹物流动态跟踪
TikTok搜索结果不显示怎么办 TikTok搜索刷新与优化方法
Word 2003字体大小设置方法
Dagster资产间数据传递与用户配置管理教程
C++怎么解决数值计算中的精度问题_C++浮点数误差与数值稳定性分析
mysql中如何配置字符集和排序规则_mysql字符集排序配置
Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制
如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践
路由器DNS怎么设置最快 优化DNS提升上网速度教程
Go语言反射机制:如何访问被嵌入结构体遮蔽的方法
键盘保修需要什么_键盘售后维修流程
HTML Canvas文本样式定制指南:解决外部字体加载与应用难题
php如何实现多域名共享session_php存储session到redis与跨域读取配置
Lar*el 关联查询:同时筛选父表与子表数据的高效策略
吃完饭就犯困是什么原因 餐后嗜睡如何缓解
J*aScript大数运算_BigInt使用指南
《下一站江湖2》风神腿获取攻略
快手网页版官方访问 快手网页版页面在线打开
TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法
《U校园》学生登录入口2025
Google Drive API服务器端访问指南:服务账户认证详解
火柴人战争网页版在线玩
《优志愿》修改手机号方法
windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化
Go语言反射机制下访问嵌入结构体中的被遮蔽方法
steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明
《procreate》绘制渐变效果教程
PDF文件去水印平台入口 PDF水印删除网址
掌握Go App Engine项目结构与GOPATH:包管理与导入实践
J*aScript实现网页表单实时输入字段比较与验证教程
使用CSS :has() 选择器实现父元素样式控制:从子元素反向应用样式
在Django中动态检查模型关联:一种灵活的解决方案
易车网官网直达入口 易车网在线登录入口
TikTok网页版实时观看入口 TikTok网页版短视频在线浏览
谷歌浏览器官网地址整理_谷歌浏览器新版直连2026稳定访问
《大润发优鲜》充值方法介绍
蜻蜓FM如何设置移动流量播放
b站如何管理订阅_b站订阅标签分类管理
《花瓣》创建专辑方法
139邮箱登录入口官网 139邮箱登录入口官网网址
《兴业银行》注册登录方法
163邮箱在线登录 163邮箱网页版在线入口
Python实战:高效处理实时数据流中的最小/最大值
韩剧圈正版官网入口_韩剧圈官方指定登录
composer licenses 命令:如何检查项目依赖的许可证?
Python中深度嵌套字典与列表的数据提取与条件过滤指南
小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】
如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成
2025-11-13
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。