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()
												
											Go/Python 基于gRPC传输图片的更多相关文章
- 技术实践:教你用Python搭建gRPC服务
		
摘要:gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言. 本文分享自华为云社区& ...
 - python基于LeanCloud的短信验证
		
python基于LeanCloud的短信验证 1. 获取LeanCloud的Id.Key 2. 安装Flask框架和Requests库 pip install flask pip install re ...
 - Python基于共现提取《釜山行》人物关系
		
Python基于共现提取<釜山行>人物关系 一.课程介绍 1. 内容简介 <釜山行>是一部丧尸灾难片,其人物少.关系简单,非常适合我们学习文本处理.这个项目将介绍共现在关系中的 ...
 - Python 基于Python实现的ssh兼sftp客户端(上)
		
基于Python实现的ssh兼sftp客户端 by:授客 QQ:1033553122 实现功能 实现ssh客户端兼ftp客户端:实现远程连接,执行linux命令,上传下载文件 测试环境 Win7 ...
 - Python基于socket模块实现UDP通信功能示例
		
Python基于socket模块实现UDP通信功能示例 本文实例讲述了Python基于socket模块实现UDP通信功能.分享给大家供大家参考,具体如下: 一 代码 1.接收端 import ...
 - Python基于正则表达式实现文件内容替换的方法
		
Python基于正则表达式实现文件内容替换的方法 本文实例讲述了Python基于正则表达式实现文件内容替换的方法.分享给大家供大家参考,具体如下: 最近因为有一个项目需要从普通的服务器移植到SAE,而 ...
 - Python基于回溯法解决01背包问题实例
		
Python基于回溯法解决01背包问题实例 这篇文章主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友 ...
 - 通过python基于netconf协议获取网络中网元的配置数据,助力企业网络控制自动化轻松实现!
		
摘要:在当今信息化时代,大多数企业都需要网络支撑企业的ICT运行,提升企业运行效率,针对企业网络中的网元设备(包括交换机,路由器,防火墙等),很多企业希望根据自身的业务特点定制网络管理,比如可以实现网 ...
 - python中grpc配置asyncio使用
		
python中grpc配置asyncio使用 安装grpclib pip3 install grpclib protoc编译.proto文件,生成源码文件 python -m grpc_tools.p ...
 - Python基于周立功ZCANPRO开发刷写脚本
		
一.概述 1.背景 本文章主要是记录用Python基于周立功ZCANPRO开发VIN和SN码刷写工具. 2.环境搭建 Python3.8.10 32位(必须) 周立功上位机:ZCANPRO 周立功CA ...
 
随机推荐
- 5vue 样式绑定
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - LeetCode 之 559. N叉树的最大深度
			
原题链接 思路: 递归计算每个子树的深度,返回最大深度即可 python/python3: class Solution(object): def maxDepth(self, root): &quo ...
 - C语言基础编程题
			
//1.ASCII码值 ->相应字符 #include <stdio.h> int main() { int asc; scanf("%d",&asc); ...
 - cerebro简单使用 , ES界面化工具 , 网页查看 , 操作索引
			
下载安装 下载地址 https://github.com/lmenezes/cerebro/releases 解压即用 , 目录中不能有空格和中文 需要jdk11及以上(实际我本机只有jdk8也能用) ...
 - python中的字符串/列表查找函数小总结
			
find()和index() 首先是适用情况, 'list' object has no attribute 'find' , list没有find方法, str全有. 返回的情况: 查找成功都会返回 ...
 - filebeat+elasticsearch+kibana
			
一.到elasticsearch官网下载 filebeat+elasticsearch+kibana http://www.elasticsearch.cn/ 二.安装filebeat tar -xz ...
 - node+appium安装
			
node是什么: node全称Node.js,是一个基于Chrome V8引擎的JavaScript运行环境,一个让JavaScript 运行在服务端的开发平台:它让JavaScript成为与PH ...
 - bytes转化为字典
			
import requestsurl='https://su.ke.com/api/listtop?type=resblock&resblock_id=2311062653496924& ...
 - ubuntu14.04 cm12.0 genymotion
			
前几天在ubuntu14.04编译过android5.0.1源码,但是呢?不知怎么运行不起来,后来又试了试把img文件在win平台运行虚拟机不知怎么还是不行,再后来想通过刷机运行学习framework ...
 - 前端程序员需要了解的MySQL
			
数据库的基本概念 数据库(database)是用来组织.存储和管理数据的仓库.对数据库中的数据可以进行增删改查操作.市面上常见的数据库有: MySQL(使用最广泛.流行度最高的开源免费数据库 Comm ...