定义.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 】
相关推荐:
《东方航空》添加乘机人方法
QQ网页版入口导航 QQ网页版在线访问通道
使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程
HTML中多图片上传与预览:解决ID冲突的专业指南
解决CSS background 属性中 cover 关键字的常见误用
mysql中如何配置字符集和排序规则_mysql字符集排序配置
《豆瓣》私信用户方法
AO3中文入口稳定分享_AO3官网HTTPS看文详解
J*aScript包管理器_Npm与Yarn对比
wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式
电子白板帮助菜单使用指南
b站如何管理订阅_b站订阅标签分类管理
Google Cloud Functions 时区处理指南:理解与最佳实践
Golang如何使用log记录日志信息_Golang log日志记录方法总结
《合金装备4》有望推出重制版!制作人发话了
《绿竹漫游》关闭消息通知方法
京东快递物流信息不更新怎么办_物流停滞原因与处理方法
Pandas中基于动态偏移量实现DataFrame列值位移的策略
多闪电脑版下载_多闪PC端模拟器使用
汽车之家网页版免费登录_汽车之家官网首页直接进入
Python自动化抓取GBGB赛狗比赛结果:日期范围与赛道筛选教程
4399小游戏下装链接 4399小游戏下载链接入口
《万兴喵影》导出视频方法
夸克浏览器资源嗅探怎么用 夸克浏览器网页资源下载技巧【教程】
解决Pandas DataFrame高度碎片化警告:高效创建多列的策略
oppo手机如何通过下拉通知栏截图_oppo手机通知栏快捷截图方法
QQ邮箱注册地址 免费获取QQ邮箱账号
解决CSS布局中意外顶部空白问题的教程
word表格如何按某一列内容进行排序_Word表格按列排序方法
Chart.js 教程:自定义插件实现图表与图例间距调整
《金山词霸》语音翻译方法
Python模块化编程:避免循环导入与共享函数的最佳实践
盲鳗善于分泌黏液猜猜主要用来做什么
C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较
《海豚家》注销账号方法
《跳跳舞蹈》循环播放方法
智慧职教mooc平台登录网址 智慧职教mooc官网直达
j*a中ArrayBlockingQueue的使用
Win11便笺在哪打开 Win11桌面便笺(Sticky Notes)使用方法【详解】
《U校园》学生登录入口2025
QQ阅读小说搜索入口地址_QQ阅读小说搜索入口地址搜索在线阅读
西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法
Three.js中动态更换3D模型纹理的教程
优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南
如何查询国外邮政编码_国外邮政编码查询的多种有效途径
《爱笔思画x》涂色教程
在VS Code中利用AI辅助进行代码迁移
PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角
pubmed数据库官方主页_pubmed学术论文查找官网直达
苹果如何下载nanobanana
2025-11-13
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。