"""
This is a RPC server/client implementation using socket
* It authenticate the client with a secret shared by client/server
* It uses JSON to serialize the function call payload
"""
import socket
import random, string
import hmac
import json
import threading
secret = "SECRET"
class RPCHandler:
def __init__(self, secret):
self._secret = secret
self._register = {}
def register_func(self, func):
self._register[func.__name__] = func
def handle_call(self, sock):
keymsg = ''.join([random.choice(string.lowercase) for i in range(8)])
sock.sendall(keymsg)
hash = hmac.new(self._secret, keymsg)
digest = hash.digest()
response = sock.recv(512)
if response != digest:
sock.sendall("Authentication Failed!")
sock.close()
else:
sock.sendall("Authenticated!")
try:
while True:
req = sock.recv(512)
d = json.loads(req)
funcname = d["name"]
args = d["args"]
kwargs = d["kwargs"]
print("Client calling %s(%s, %s)" % (funcname, args, kwargs))
try:
ret = self._register[funcname](*args, **kwargs)
sock.sendall(json.dumps({"ret": ret}))
except Exception as e:
sock.sendall(json.dumps({"exception": str(e)}))
except EOFError:
print("Closing RPC Handler...")
handler = RPCHandler(secret)
class RPCServer:
def __init__(self, address):
self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._sock.bind(address)
def serve_forever(self):
self._sock.listen(0)
while True:
client_sock,_ = self._sock.accept()
thread = threading.Thread(target=handler.handle_call, args=(client_sock, ))
thread.daemon = True
thread.start()
class RPCProxy(object):
def __init__(self, address, secret):
self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self._sock.connect(address)
msg = self._sock.recv(512)
h = hmac.new(secret, msg)
self._sock.sendall(h.digest())
print(self._sock.recv(512))
def __getattr__(self, name):
def proxy_func(*args, **kwargs):
payload = {
"name": name,
"args": args,
"kwargs": kwargs
}
self._sock.sendall(json.dumps(payload))
result = json.loads(self._sock.recv(512))
if "exception" in result:
raise Exception(result['exception'])
else:
return result['ret']
if name.startswith("_"):
return super(RPCProxy, self).__getattr__(name)
else:
return proxy_func
【python-網絡通信】這是一個用socket實現的簡單的python RPC服務器/客戶端阀坏。* 通過客戶端/服務器共用的密碼認證客戶端* 使用JSON序列化函數調用有效負載
?著作權歸作者所有,轉載或內容合作請聯系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箫老,“玉大人封字,你說我怎么就攤上這事∷w蓿” “怎么了阔籽?”我有些...
- 正文 為了忘掉前任在辆,我火速辦了婚禮,結果婚禮上度苔,老公的妹妹穿的比我還像新娘匆篓。我一直安慰自己,他們只是感情好寇窑,可當我...
- 文/花漫 我一把揭開白布鸦概。 她就那樣靜靜地躺著,像睡著了一般甩骏。 火紅的嫁衣襯著肌膚如雪窗市。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼二蓝,長吁一口氣:“原來是場噩夢啊……” “哼誉券!你這毒婦竟也來了?” 一聲冷哼從身側響起刊愚,我...
- 正文 年R本政府宣布,位于F島的核電站咬腋,受9級特大地震影響羹膳,放射性物質發(fā)生泄漏。R本人自食惡果不足惜帝火,卻給世界環(huán)境...
- 文/蒙蒙 一溜徙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧犀填,春花似錦蠢壹、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冕广,卻和暖如春疏日,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撒汉。 一陣腳步聲響...
推薦閱讀更多精彩內容
- 一. TCP服務器的實現 1.創(chuàng)建套接字 2.綁定本地終節(jié)點 3.開啟監(jiān)聽 4.異步接收客戶端連接請求 5.異步接...
- 就一個不用 理解之間的通信代碼原理之類的 幾句代碼快速搭建服務器和客戶端 思維導圖: 過程大概是KGSocke...
- 一. TCP服務器的實現 1.創(chuàng)建套接字 Socket serverSocket = new Socket(Add...
- 接著上篇繼續(xù)講 1.KGNetSession socket的會話管理 就是管理接收/發(fā)送 數據消息的 這里流程是...
- 服務器端 server #!/usr/bin/env python # _*_ coding:utf-8 _*_ ...