grpc服务器和客户端互传数据
生活随笔
收集整理的這篇文章主要介紹了
grpc服务器和客户端互传数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、客戶端給服務器傳數據
1、data.proto
syntax = 'proto3'; // 服務定義 service data{// 函數定義 data_request參數 data_reply返回數據rpc serving(data_request) returns (data_reply) {} } message data_request{string cmd= 1; } message data_reply{string values = 1; }?2、data_client.py
import data_pb2 import data_pb2_grpc import grpc import base64 import time def run():# 監聽頻道channel = grpc.insecure_channel('127.0.0.1:8080')# 客戶端使用Stub類發送請求, 參數為頻道, 為了綁定鏈接stub = data_pb2_grpc.dataStub(channel)while True:# 返回的結果就是proto中定義的類f = open("data.json", 'rb')img_64 = base64.b64encode(f.read())f.close()response = stub.serving(data_pb2.data_request(cmd=img_64))print(response)value = response.valuesprint(value)time.sleep(10) if __name__ == '__main__':run()3、data_server.py
?
import data_pb2 import data_pb2_grpc import grpc from concurrent import futures import time import base64 class ServerGreeter(data_pb2_grpc.dataServicer):# 重寫接口函數.輸入和輸出都是proto中定義的Data類型def serving(self, request):img_64 = base64.b64decode(request.cmd)if img_64:f = open('datacopy.json', 'wb')f.write(img_64)f.close()return data_pb2.data_reply(values="ok") def serve():# 定義服務器并設置最大連接數,corcurrent.futures是一個并發庫,類似于線程池的概念# 創建一個服務器server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))# 在服務器中添加派生的接口服務(自己實現了處理函數)a=data_pb2_grpc.add_dataServicer_to_server(ServerGreeter(), server)# 添加監聽端口server.add_insecure_port('127.0.0.1:8080')#啟動服務server.start()try:while True:time.sleep(1)except KeyboardInterrupt:server.stop(0) if __name__ == '__main__':serve()?二、服務端給客戶端傳數據
1、data.proto
syntax = 'proto3'; // 服務定義 service data{// 函數定義 data_request參數 data_reply返回數據rpc serving(data_request) returns (data_reply) {} } message data_request{string cmd= 1; } message data_reply{string values = 1; }2、client.py
import data_pb2 import data_pb2_grpc import grpc import base64 _HOST='localhost' _PORT='8080' def run():channel = grpc.insecure_channel(_HOST+':'+_PORT)stub = data_pb2_grpc.dataStub(channel)response = stub.serving(data_pb2.data_request())imgf = base64.b64decode(response.values)f = open('./b.jpg', 'wb')f.write(imgf)f.close() if __name__ == '__main__':run()?
3、server.py
?
import data_pb2 import data_pb2_grpc import grpc from concurrent import futures import time import base64 _HOST='localhost' _PORT='8080' class ServerGreeter(data_pb2_grpc.dataServicer):def serving(self, request, context):print('serving:', request.cmd)f = open('./a.jpg', 'rb')img_64 = base64.b64encode(f.read())f.close()return data_pb2.data_reply(values=img_64) def serve():server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))data_pb2_grpc.add_dataServicer_to_server(ServerGreeter(), server)server.add_insecure_port(_HOST+':'+_PORT)server.start()try:while True:time.sleep(60 * 60 * 24)except KeyboardInterrupt:server.stop(0)if __name__ == '__main__':serve()若是服務器往客戶端發送消息,就利用在服務器中重寫類的方法的return中。形式為data.proto中的data_reply中定義的value=XXX。如data_pb2.data_reply(values=img_64)
若是服務器接收客戶端發送的消息,就利用在服務器中重寫類的方法中的參數request。形式為data.proto中的data_request中定義的cmd。如img_64 = base64.b64decode(request.cmd)
若是客戶端給服務器發送消息,就利用stub存根的方法此時需要使用data_request中定義的cmd,如response = stub.serving(data_pb2.data_request(cmd=img_64))
若是客戶端接收服務器發送過來的消息,就直接利用stub存根的方法。response = stub.serving(data_pb2.data_request())
總結
以上是生活随笔為你收集整理的grpc服务器和客户端互传数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python并发编程4-线程
- 下一篇: 二叉树---树的深度递归理解