文章目录  1.http 客户端-RPC客户端 1.http 服务端-RPC服务端 3.WireShark抓包分析 3.1客户端到服务端的HTTP/JSON报文 3.2服务端到客户端的HTTP/JSON报文   
 
import  json
import  requests
class  RPCClient : def  __init__ ( self,  server_url) : self. server_url =  server_urldef  call ( self,  method,  params) : request_data =  { 'method' :  method, 'params' :  params, 'id' :  1 } json_data =  json. dumps( request_data) . encode( 'utf-8' ) response =  requests. post( self. server_url,  json_data,  headers= { 'Content-type' :  'application/json' } ) result =  response. json( ) if  'error'  in  result: raise  Exception( result[ 'error' ] ) return  result[ 'result' ] 
client =  RPCClient( 'http://192.168.1.9:8000' ) 
result =  client. call( 'add' ,  [ 3 ,  5 ] ) 
print ( "Result:" ,  result) 
import  json
from  http. server import  BaseHTTPRequestHandler,  HTTPServer
class  RPCHandler ( BaseHTTPRequestHandler) : def  do_POST ( self) : content_length =  int ( self. headers[ 'Content-Length' ] ) json_data =  self. rfile. read( content_length) . decode( 'utf-8' ) print ( "-------json_data:{}" . format ( json_data) ) data =  json. loads( json_data) print ( "-------data:{}" . format ( data) ) result =  self. process_request( data) self. send_response( 200 ) self. send_header( 'Content-type' ,  'application/json' ) self. end_headers( ) print ( json. dumps( result) . encode( 'utf-8' ) ) self. wfile. write( json. dumps( result) . encode( 'utf-8' ) ) def  process_request ( self,  data) : if  'method'  in  data: method =  data[ 'method' ] if  method ==  'add' : if  'params'  in  data and  len ( data[ 'params' ] )  ==  2 : a,  b =  data[ 'params' ] result =  a +  breturn  { 'result' :  result} return  { 'error' :  'Invalid request' } 
def  run_server ( ) : port =  8000 server_address =  ( '192.168.1.9' ,  port) httpd =  HTTPServer( server_address,  RPCHandler) httpd. serve_forever( ) if  __name__ ==  '__main__' : run_server( )