zoukankan      html  css  js  c++  java
  • Title

    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)
    
  • 相关阅读:
    【高并发】面试官问我:为什么局部变量是线程安全的?
    Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!
    【高并发】学好并发编程,关键是要理解这三个核心问题
    【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
    12张图带你彻底理解分布式事务产生的场景和解决方案!!
    【高并发】面试官:讲讲高并发场景下如何优化加锁方式?
    【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!
    十一长假我肝了这本超硬核PDF,现决定开源!!
    一文搞懂PV、UV、VV、IP及其关系与计算
    我把这个贼好用的Excel导出工具开源了!!
  • 原文地址:https://www.cnblogs.com/guotianbao/p/12333654.html
Copyright © 2011-2022 走看看