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的使用的更多相关文章

  1. pyjsonrpc模块使用

    pyjsonrpc模块的远程过程调用方法. # -*- coding:utf-8 -*- #!/usr/bin/env python2.7 # @Author : tianbao # @Contact ...

  2. week06 07 创建RPC SERVER 换个镜像安装下载

    RPC server 使用python类库 https://pypi.org/project/python-jsonrpc/ 和NPM 不一样 他没有global选项 他安装的就是全局的安装的类库叫p ...

  3. 从0到1:全面理解RPC远程调用

    上一篇关于 WSGI 的硬核长文,不知道有多少同学,能够从头看到尾的,不管你们有没有看得很过瘾,反正我是写得很爽,总有一种将一样知识吃透了的错觉. 今天我又给自己挖坑了,打算将 rpc 远程调用的知识 ...

随机推荐

  1. [urllib]urlretrieve在python3

    python3下面要使用:urllib.request.urlretrieve()这种形式的调用 from urllib.request import urlretrieve urlretrieve( ...

  2. sqlserver backup and restore -- partital restore

    Like a tratitional database, sqlserver not only could resotre full database but also do restore one ...

  3. DOM - Document Object Model

    Document Object Model

  4. 消息队列MQ集合

    消息队列MQ集合 消息队列简介 kafka简介 Centos7部署zookeeper和Kafka集群 .

  5. iptables服务器主机防火墙

    iptables参数说明: Commands: Either long or short options are allowed. --append -A chain 链尾部追加一条规则 --dele ...

  6. [Redis-CentOS7]Redis发布订阅操作(七)

    发布订阅 发布:打电话 订阅:接电话 订阅频道 127.0.0.1:6379> SUBSCRIBE msg Reading messages... (press Ctrl-C to quit) ...

  7. thinkPHP中Model的字段映射问题

    在model定义中不要自己定义相应的字段变量,因为一旦定义,之后的赋值会直接赋给自己定义的属性,但实际上model抽象类重写了__set()方法,将未定义的属性存入了$data里面,写入数据库是也会从 ...

  8. codewars--js--Happy numbers++无穷大判断

    问题描述: A happy number is a number defined by the following process: starting with any positive intege ...

  9. 手把手教你快速使用数据可视化BI软件创建全球经济贸易分析大屏

    灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件.   本文以全球经济贸易分析大屏为例 ...

  10. Linux内存管理解析(二) : 关于Linux内存管理的大体框架

    什么是内存管理 ? 首先内存管理管理的主要对象是虚拟内存,但是虚拟内存对应的映射主要为物理内存,其次也可能通过交换空间把虚拟内存与硬盘映射起来,既然如此,那我们先了解物理内存的管理. 对于物理内存而言 ...