一.创建proto文件
logServer.proto
// [python quickstart](https{}//grpc.io/docs/quickstart/python.html//run-a-grpc-application)
// python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. logServer.proto
// logServer.proto
syntax = "proto3";
service LogServer {
rpc SayHello(SayHelloReq) returns (SayHelloRes) {}
}
message SayHelloReq{
string greet = 1;
}
message SayHelloRes{
string reply = 1;
}
更多proto的语法可去英文原版(需要翻墙)或中文版学习
二.生成相应文件
python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. logServer.proto
三.创建服务器进程程序
server.py
import grpc,time
import logServer_pb2
import logServer_pb2_grpc
from concurrent import futures
#实现logServer.proto的函数
class LogServer(logServer_pb2_grpc.LogServerServicer):
#启动一个客户端连接
def SayHello(self, request:logServer_pb2.SayHelloReq, context):
greet=request.greet
print(greet)#打印传来的问候
res=logServer_pb2.SayHelloRes(reply=greet+"?")
return res
#启动服务(输入ip,port)
def serve(ip,port):
# 启动 rpc 服务
server = grpc.server(futures.ThreadPoolExecutor(max_workers=30))#限制进程的线程数
logServer_pb2_grpc.add_LogServerServicer_to_server(LogServer(), server)
ip_port="%s:%s"%(ip,port)
server.add_insecure_port(ip_port)
print("listening port "+str(port)+"...")
server.start()
while True:# start 为非阻塞函数,需要自行阻塞
time.sleep(1)
serve("127.0.0.1","9000")
四.调用服务器进程的函数
client.py
import grpc,json
import logServer_pb2
import logServer_pb2_grpc
channel=grpc.insecure_channel("127.0.0.1:9000")#ip和port和服务器的相同
stub=logServer_pb2_grpc.LogServerStub(channel)
req=logServer_pb2.SayHelloReq(greet="你好啊")
reply=stub.SayHello(req).reply
#含有汉字,需要utf-8的编码和解码
reply=reply.encode('utf-8')
reply=reply.decode('utf-8')
print(reply)
五.先运行server.py,再运行client.py