pyjsonrpc的使用
pyjsonrpc的使用
客户端 JsonRpcClient.py
#!usr/bin/env python2.7
# -*- coding: utf-8 -*-
import ssl
import socket
import inspect
import logging
import pyjsonrpc
try:
ssl._create_default_https_context = ssl._create_unverified_context
except Exception:
pass
logger = logging.getLogger('blog')
def func():
# 获取当前函数名, 如果是类直接调用,则是类名
return inspect.stack()[1][3]
class JsonRpcIF(object):
"""封装的基类"""
def __init__(self, server, port, ssl=True):
if ssl:
self.url = "https://%s:%s/jsonrpc" % (server, port)
else:
self.url = "http://%s:%s/jsonrpc" % (server, port)
def request(self, method, params, timeout=None):
# params是参数: {"key1": "value1", "key2": "value2"}
try:
self.client = pyjsonrpc.HttpClient(
url=self.url,
timeout=timeout,
)
# 获取服务端执行相应method后的结果
response = getattr(self.client, method)(params)
except socket.timeout:
logger.error("JsonRpc request '%s' timeout", method)
response = {"status": {"code": -1, "msg": "timeout"}}
except Exception as err:
logger.error("JsonRpc request '%s' exception: %s", method, err)
response = {"status": {"code": -2, "msg": err}}
return response
class LocalRpc(JsonRpcIF):
"""连接本服务器rpc"""
def __init__(self, server="127.0.0.1", port=8080):
super(LocalRpc, self).__init__(server, port, ssl=False)
def get_mac(self, request=None):
# func() 返回的是"get_mac"字符串 request是参数: {"key1": "value1", "key2": "value2"}
return self.request(func(), request, timeout=5)
def get_server_ip(self, request=None):
# func() 返回的是"get_server_ip"字符串
return self.request(func(), request, timeout=10)
def get_file_name(self, request=None):
# func() 返回的是"get_file_name"字符串
return self.request(func(), request, timeout=None)
locRpc = LocalRpc(server="127.0.0.1", port=8080)
服务端 JsonRpcServer.py
#!usr/bin/env python2.7
# -*- coding: utf-8 -*-
import logging
import traceback
import pyjsonrpc
logger = logging.getLogger('blog')
class RequestHandler(pyjsonrpc.HttpRequestHandler):
@pyjsonrpc.rpcmethod
def get_mac(self, params):
ret = {"status": {"code": 0, "msg": "success"}, "mac": ""}
try:
# params为 {"key1": "value1", "key2": "value2"}
key1 = params.get("key1", "")
except Exception as err:
logger.error("get mac failed: %s", err)
ret = {"status": {"code": -1, "msg": err}}
return ret
@pyjsonrpc.rpcmethod
def get_server_ip(self, params):
ret = {"status": {"code": 0, "msg": "success"}, "server_ip": ""}
try:
# params为 {"key1": "value1", "key2": "value2"}
key1 = params.get("key1", "")
except Exception:
# traceback.format_exc()能获取到详细的错误打印栈
logger.error("get server ip error, %s", traceback.format_exc())
ret = {"status": {"code": -1, "msg": traceback.format_exc()}}
return ret
@pyjsonrpc.rpcmethod
def get_file_name(self, params):
ret = {"status": {"code": 0, "msg": "success"}, "get_file_name": ""}
try:
key1 = params.get("key1", "")
except Exception:
# traceback.format_exc()能获取到详细的错误打印栈
logger.error("get file name error, %s", traceback.format_exc())
ret = {"status": {"code": -1, "msg": traceback.format_exc()}}
return ret
def main(server_ip, port):
# 线程HTTP-Server
http_server = pyjsonrpc.ThreadingHttpServer(
server_address=(server_ip, port),
RequestHandlerClass=RequestHandler
)
http_server.serve_forever()
if __name__ == '__main__':
main('localhost', 8080)
pyjsonrpc的使用的更多相关文章
- pyjsonrpc模块使用
pyjsonrpc模块的远程过程调用方法. # -*- coding:utf-8 -*- #!/usr/bin/env python2.7 # @Author : tianbao # @Contact ...
- week06 07 创建RPC SERVER 换个镜像安装下载
RPC server 使用python类库 https://pypi.org/project/python-jsonrpc/ 和NPM 不一样 他没有global选项 他安装的就是全局的安装的类库叫p ...
- 从0到1:全面理解RPC远程调用
上一篇关于 WSGI 的硬核长文,不知道有多少同学,能够从头看到尾的,不管你们有没有看得很过瘾,反正我是写得很爽,总有一种将一样知识吃透了的错觉. 今天我又给自己挖坑了,打算将 rpc 远程调用的知识 ...
随机推荐
- 从数组中找到topK的元素(序号)
问题: 在n个数中找出最大的k个数. 多次求min()或求max() 最简单的方法是对大小为k的数组进行n次求min计算(或者对大小为n的数组进行k次求max计算)最后能够找出最大k个数.复杂度是O( ...
- c语言小游戏-三子棋的完成
三子棋的实现 一.实现思路 1.初始化数组 三子棋是九宫格的格式,所以用二维数组接收数据.用‘O’代表电脑下的子,‘X’代表玩家下的子.未下子的时候初始化 ’ ‘(space).则二维数组为“char ...
- 编辑crontab添加Linux计划任务
在做实验楼的比赛时的题目 用到了crontable 1. 为用户shiyanlou添加一个计划任务 2. 每天凌晨2点定时执行 3. 将/var/log/dpkg.log /var/log/mysql ...
- rabbitmq在kubernetes中持久化集群部署
背景 Javashop电商系统的消息总线使用的事rabbitmq,在订单创建.静态页生成.索引生成等等业务中大量采用异步消息系统,这个对于mq高可用的要求有两个重要的考量: 1.集群化 2.可扩容 3 ...
- Webpack 中 file-loader 和 url-loader 的区别
如果我们希望在页面引入图片(包括img的src和background的url).当我们基于webpack进行开发时,引入图片会遇到一些问题. 其中一个就是引用路径的问题.拿background样式用u ...
- centos7安装mysql-5.6.43二进制包
卸载老版本的MySQL.查找并删除mysql有关的文件 # find / -name mysql # rm -rf /usr/lib64/mysql /usr/share/mysql [root@lo ...
- Lambda如何实现条件去重distinct List,如何实现条件分组groupBy List
条件去重 我们知道, Java8 lambda自带的去重为 distinct 方法, 但是只能过滤整体对象, 不能实现对象里的某个值进行判定去重, 比如: List<Integer> nu ...
- Linux监控-历史细项数据回溯
Linux监控数据回溯 网络服务监控 应用场景: lvs 后端内网端机器网络波动监控: nginx 80.443端口连接监控: mysql 连接监控 以上为抛砖引玉,根据环境安装到监控工具(open ...
- 正则表达式过滤html注释内容
Regex.Replace("<!--(.|[\r\n])*?-->",string.Empty)
- go实现java虚拟机02
上一篇通过flag包实现了命令行参数的解析,其实就是将输入的参数保存到一个结构体中,上一篇说过的例如java -classpath hello.jar HelloWorld这种命令,那么HelloWo ...