一.创建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

服务端
客户端