双向流通信模式支持客户端和服务器持续互发消息,适用于聊天系统等实时场景。通过在.proto文件中使用stream关键字定义请求和响应类型,实现双方全双工通信;利用protoc生成Go代码后,服务端和客户端分别通过Recv()和Send()方法在循环中处理消息收发,可扩展为广播或多用户交互系统。
gRPC 支持四种通信模式,其中双向流(Bidirectional Streaming)是最灵活的一种。在这种模式下,客户端和服务器都可以连续发送多个消息,彼此独立读写,适用于实时通信场景,比如聊天系统、实时数据推送等。
要使用 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 方法接收一个消息流,并返回一个消息流,表示客户端和服务器都能持续发送和接收消息。
使用 protoc 和插件生成 Go 代码:
protoc --go_out=. --go-grpc_out=. chat.proto会生成两个文件:chat.pb.go 和 chat_grpc.pb.go,包含服务接口和数据结构定义。
服务端需要实现生成的接口,在流中循环读取客户端消息,同时可以随时发送消息:
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(c
ontext.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 的使用时机,就能构建出高效的实时通信系统。
# go
# golang
# stream
# echo
# String
# if
# for
# Error
# printf
# 循环
# 数据结构
# 接口
# nil
# background
# rpc
# 客户端
# 服务端
# 多个
# 适用于
# 发送消息
# 放在
# 就能
# 都能
# 也能
相关文章:
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
如何快速登录WAP自助建站平台?
制作网站外包平台,自动化接单网站有哪些?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何在Golang中引入测试模块_Golang测试包导入与使用实践
如何在Tomcat中配置并部署网站项目?
建站之星好吗?新手能否轻松上手建站?
建站之星如何优化SEO以实现高效排名?
深圳网站制作案例,网页的相关名词有哪些?
如何在橙子建站中快速调整背景颜色?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
建站主机如何选?高性价比方案全解析
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
广州美橙建站如何快速搭建多端合一网站?
如何通过.red域名打造高辨识度品牌网站?
如何在局域网内绑定自建网站域名?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何在阿里云虚拟主机上快速搭建个人网站?
Android滚轮选择时间控件使用详解
C++时间戳转换成日期时间的步骤和示例代码
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何通过WDCP绑定主域名及创建子域名站点?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
香港服务器部署网站为何提示未备案?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
建站之星如何通过成品分离优化网站效率?
如何零基础开发自助建站系统?完整教程解析
如何快速搭建高效WAP手机网站吸引移动用户?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
如何挑选最适合建站的高性能VPS主机?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
微信小程序 input输入框控件详解及实例(多种示例)
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
高防服务器租用首荐平台,企业级优惠套餐快速部署
网站制作模板下载什么软件,ppt模板免费下载网站?
如何选择建站程序?包含哪些必备功能与类型?
怀化网站制作公司,怀化新生儿上户网上办理流程?
建站之星如何取消后台验证码生成?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
教学论文网站制作软件有哪些,写论文用什么软件
?
网站制作企业,网站的banner和导航栏是指什么?
如何在阿里云通过域名搭建网站?
如何配置FTP站点权限与安全设置?
如何选择CMS系统实现快速建站与SEO优化?
*请认真填写需求信息,我们会在24小时内与您取得联系。