Go/Python 基于gRPC传输图片
python程序作为服务端,Go程序作为客户端,基于gPRC进行通信
客户端
定义proto文件:
syntax = "proto3"; option go_package = ".;transfer"; service Greeter { rpc SendImage (ImageRequest) returns (ImageReply) {} } message ImageRequest { string name = 1; bytes image = 2; } message ImageReply { string message = 1; }
编译: protoc --go_out=. --go-grpc_out=. ./*.proto
调用:
package main import ( "context" "google.golang.org/grpc" "io/ioutil" "log" "time" "vtion/transfer" ) const ( address = "localhost:50051" name = "test" ) func main() { conn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { log.Fatalf("connect error: %v", err.Error()) } defer conn.Close() client := transfer.NewGreeterClient(conn) ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() image, err := ioutil.ReadFile("./images/binary.jpg") if err != nil { log.Fatalf("read error: %v", err.Error()) } res, err := client.SendImage(ctx, &transfer.ImageRequest{Name: name, Image: image}) if err != nil { log.Fatalf("send error: %v", err.Error()) } log.Println(res.Message) }
服务端
proto文件:
syntax = "proto3"; service Greeter { rpc SendImage (ImageRequest) returns (ImageReply) {} } message ImageRequest { string name = 1; bytes image = 2; } message ImageReply { string message = 1; }
编译: python3 -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. transfer.proto
调用:
from concurrent import futures from PIL import Image import time, logging, grpc, io import transfer_pb2 import transfer_pb2_grpc class Greeter(transfer_pb2_grpc.GreeterServicer): def SendImage(self, request, context): stream = request.image data = io.BytesIO(stream) image = Image.open(data) image.save("test.png") return transfer_pb2.ImageReply(message=f"success {request.name}") def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) transfer_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) server.add_insecure_port("[::]:50051") server.start() server.wait_for_termination() if __name__ == "__main__": serve()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构