转载自:
https://blog.csdn.net/ctwy291314/article/details/91866261
修改了部分代码
Ubuntu18.04安装gRPC
-
protobuf-compiler-grpc安装
sudo apt-get install protobuf-compiler-grpc
-
protobuf-compiler安装
sudo apt-get install protobuf-compiler
-
gRPC 的安装
pip install grpcio
-
安装 ProtoBuf 相关的 python 依赖库
pip install protobuf
-
安装 python grpc 的 protobuf 编译工具
pip install grpcio-tools
编写示例工程
-
工程结构
-
编写 proto 文件
在工程下新建
stream
目录,新建
stream.proto
文件,文件可名称任意syntax = "proto3"; package stream; service StreamService { rpc SimpleFun(RequestData) returns (ResponseData){} } message RequestData { string text = 1; int32 name = 2; #参数增加数字增加 } message ResponseData { string text = 1; }
-
编译 protobuf
切换至
stream
目录,执行以下命令:
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./stream.proto
在
stream
目录中执行编译,会生成:
stream_pb2.py
与
stream_pb2_grpc.py
,需修正
stream_pb2_grpc.py
的引用
stream__pb2
的路径
-
实现 server 端,
simple_server.py
#! /usr/bin/env python # -*- coding: utf-8 -*- import grpc import time from concurrent import futures from stream import stream_pb2, stream_pb2_grpc _ONE_DAY_IN_SECONDS = 60 * 60 * 24 _HOST = 'localhost' _PORT = '8883' class servicer(stream_pb2_grpc.StreamServiceServicer): def SimpleFun(self, request, context): strcontent = request.text print("received: " + strcontent) print("received: " + str(request.name)) print("Call SimpleFun End") return stream_pb2.ResponseData(text=('hello,gRPC')) def serve(): grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4)) stream_pb2_grpc.add_StreamServiceServicer_to_server(servicer(), grpcServer) grpcServer.add_insecure_port(_HOST + ':' + _PORT) grpcServer.start() try: while True: time.sleep(_ONE_DAY_IN_SECONDS) except KeyboardInterrupt: grpcServer.stop(0) if __name__ == '__main__': serve()
-
实现 client端,
simple_client.py
#! /usr/bin/env python # -*- coding: utf-8 -*- import grpc from stream import stream_pb2, stream_pb2_grpc _HOST = 'localhost' _PORT = '8883' def run(): conn = grpc.insecure_channel(_HOST + ':' + _PORT) client = stream_pb2_grpc.StreamServiceStub(channel=conn) response = client.SimpleFun(stream_pb2.RequestData(text='hello,world!', name = 0)) print("received: " + response.text) if __name__ == '__main__': run()
-
执行结果
先启动
simple_server.py
再启动
simple_client.py