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())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter BeanShell采样器提取接口响应并传递(三)

1、将fastjson-1.2.68.jar放置C:\jmeter\apache-jmeter-5.0\lib路径下 2、CSV 数据文件设置多个手机号 3、添加登录接口,${mobile}调用2种的mobile值 4、登录接口响应数据 5、BeanShell 取样器提取登录接口响应数据 //导入json包 import com.alibaba.fastjson.JSON…

pymysql.err.InternalError: (1054, Unknown column '27D24A3B' in 'where clause')之错误解决

原代码: query_image_path1SELECT imageTempFilename_0,imageTempFilename_1 FROM %s% tablename query_image_path2 where IDprojectTemp%s and IDproject%s and cameraID%s and imageflag%s%(IDprojectTemp,IDproject,cameraID,imageflag) query_image_path_sqlq…

Jmeter BeanShell采样器提取接口响应写入csv文件(四)

1、调用登录接口获取response数据 {"code":0,"msg":"成功","data":{"token":"bearereyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9tZW1iZXItYXBpLnN0MS50ZXN0LmxhbnhpbmthLmNvbVwvMi4wXC91c2Vyc1wvb…

js 给动态li添加动态点击事件

一、给动态li添加动态点击事件 试了网上的on,live,bind绑定&#xff0c;都不起作用。最后看到https://bbs.csdn.net/topics/390414057 上的代码。试了一遍&#xff0c;demo ok。 附上demo&#xff1a; <!DOCTYPE html> <html xmlns"http://www.w3.org/1999/…

Jmeter JDBC Request执行多条SQL语句

之前写过Jmeter操作mysql的文章https://blog.csdn.net/qq_36502272/article/details/88891873今天我们再看下如何操作多条sql语句 1、添加JDBC Connection Configuration并配置 Database URL为MySQL的连接串&#xff0c;如果要执行多条SQL语句&#xff0c;后面还要添加“?al…

Python使用HMACSHA1加密生成签名

按key升序&#xff0c;key不为sign&#xff0c;value不为空&#xff0c;再把key和value拼装成xa&yb格式&#xff0c;然后使用HmacSHA1算法生成签名 import json,hashlib,hmac,base64def sign(data):date_newfor key,value in sorted(data.items()):if key!"sign"…

sql常见语句记录

1、查询sql中数据不为空并且不为null SELECT * FROM 表名 WHERE 字段名 IS NOT NULL AND 字段名 <> ; # ‘’表示为空

Pyhon列表排序(升序和降序)

一、sort()方法&#xff1a; list.sort(cmpNone, keyNone, reverseFalse) cmp -- 可选参数, 如果指定了该参数会使用该参数的方法进行排序。 key -- 主要是用来进行比较的元素&#xff0c;只有一个参数&#xff0c;具体的函数的参数就是取自于可迭代对象中&#xff0c;指定可迭…

mysql deadlock found when trying to get lock暴力解决

如若你在运行代码时出现此问题&#xff0c;那么此博客可以略过了。 如若你也不知道怎么操作后&#xff0c;突然对表进行增删查改的操作后&#xff0c;出现此问题&#xff0c;那么采用暴力解决法 方案一&#xff1a; 1、查询是否锁表 show OPEN TABLES where In_use >0; …

Pytest Hooks方法之pytest_runtest_makereport获取测试用例结果

pytest提供的钩子(Hooks)方法之pytest_runtest_makereport&#xff0c;可以更清晰的了解用例的执行过程&#xff0c;并获取到每个用例的执行结果。 一、Hook 方法之 pytest_runtest_makereport源码&#xff1a; hookspec(firstresultTrue) def pytest_runtest_makereport(ite…

服务端和客户端测试连通ip设置记录

若服务器和客户端在同一台电脑&#xff0c;即为本机测试&#xff0c;则测试都用127.0.0.1 若是服务器和客户端在两台电脑&#xff0c;则需要在同一局域网内&#xff0c;并且ip地址填写本机ip。 若是发布在云端测试&#xff0c;则服务端地址为0.0.0.0&#xff1b;客户端地址填…

Pytest Hooks方法之pytest_collection_modifyitems改变测试用例执行顺序

pytest默认执行用例顺序是根据项目下文件名称按ascii码去收集运行的&#xff0c;文件里的用例是从上往下按顺序执行的. pytest_collection_modifyitems 这个函数顾名思义就是收集测试用例、改变用例的执行顺序的。 一、pytest_collection_modifyitems 是测试用例收集完成后&am…

MySQL 8.0开始Group by不再排序

如题所示&#xff0c;mysql 8.0 开始 group by 默认是没有排序的 那mysql 8.0 之前和 8.0 就有可能结果出现不同 需要警惕 查看版本信息 rootmysql3306.sock>[employees]>show variables like %version%; ------------------------------------------------------- | V…

Python操作Jira提交BUG

Jira提供了完善的RESTful API&#xff0c;如果不想直接请求API接口可以使用Python的Jira库来操作Jira jira Python文档https://jira.readthedocs.io/en/latest/ 安装&#xff1a;pip install jira 认证&#xff1a;Jira的访问是有权限的&#xff0c;在访问Jira项目时首先要进…

mysql 导入导出大文件

mysql导入&#xff1a; load data local infile C:/Users/Administrator.USER-20190225BY/Desktop/test.csv into table test fields terminated by\t lines terminated by\n ignore 1 lines (xianlu,chepai,shijian,jing,wei) mysql导出&#xff1a; select * from mysql.te…

Pytest之pytest.assume用例中断言1失败会继续执行后续代码断言2

一般我们做自动化测试时&#xff0c;一个用例会写多个断言&#xff0c;当第一个断言失败后&#xff0c;后面的代码就不会执行了&#xff0c;于是我们引进了pytest-assume插件可以解决断言失败后继续断言的问题。 一、安装依赖包 pip install pytest-assume 二、使用assert进…

Unable to round-trip http request to upstream错误

这几天打开浏览器经常出现Unable to round-trip http request to upstream。提示。 一直以为是网速的问题。今天百度才发现是因为打开了蓝灯。赶紧关掉蓝灯即可

Pytest之pytest-assume同用例多断言,断言1失败会执行后续代码及断言2

一般我们做自动化测试时&#xff0c;一个用例会写多个断言&#xff0c;当第一个断言失败后&#xff0c;后面的代码就不会执行了&#xff0c;于是我们引进了pytest-assume插件可以解决断言失败后继续断言的问题。一、安装依赖包pip install pytest-assume二、使用assert进行断言…

无法打开包括文件: “corecrt.h”: No such file or directory

刚开始安装qt&#xff0c;测试是否安装成功就出现此问题&#xff0c;让人很头大 参考&#xff1a;https://blog.csdn.net/x356982611/article/details/51140807的播客 编译时候使用的是最新的sdk版本10.0.10586.0版本但是它里面没有ucrt目录&#xff0c;问题找到了。 看了下v…

Pytest-ordering自定义用例执行顺序

我们一般在做自动化测试时&#xff0c;用例设计之间应该是可以相互独立执行的&#xff0c;没有一定的前后依赖关系的&#xff0c;如果我们真的有前后依赖&#xff0c;想指定用例的先后顺序&#xff0c;可以用到pytest-ordering插件解决这个问题 1、安装依赖包 pip install pyt…