新闻中心

Golang如何使用gRPC双向流进行通信_Golang gRPC双向流通信实践

2025-12-01
浏览次数:
返回列表
双向流通信模式支持客户端和服务器持续互发消息,适用于聊天系统等实时场景。通过在.proto文件中使用stream关键字定义请求和响应类型,实现双方全双工通信;利用protoc生成Go代码后,服务端和客户端分别通过Recv()和Send()方法在循环中处理消息收发,可扩展为广播或多用户交互系统。

golang如何使用grpc双向流进行通信_golang grpc双向流通信实践

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.gochat_grpc.pb.go,包含服务接口和数据结构定义。

实现服务端逻辑

服务端需要实现生成的接口,在流中循环读取客户端消息,同时可以随时发送消息:

GoEnhance GoEnhance

全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。

GoEnhance 347 查看详情 GoEnhance 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 中,避免阻塞发送。

运行与测试

启动服务端监听,再运行多个客户端,即可看到双向通信效果。每个客户端发送的消息会被服务端处理并返回,客户端也能实时接收到服务器推送的内容。

基本上就这些。双向流的核心在于并发控制和连接管理,理解好 SendRecv 的使用时机,就能构建出高效的实时通信系统。

以上就是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在线格式转换网站 

搜索