如下應用實現監聽服務器上某個端口的報文收發情況:使用方法是將該python腳本保存至py文件XX.py中,並執行python XX.py即可前台啟動,發起請求后即可通過該py應用打印請求報文和響應報文。
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from wsgiref.simple_server import make_server
from cgi import parse_qs,escape
import datetime,os,logging,re
from logging.handlers import TimedRotatingFileHandler
#全局變量
tree_result_list={}
xml_sub_list=[]
def console_log_out(logFilename):
''''' Output log to file '''
# 初始化並定義級別
logger = logging.getLogger() # 初始化
logger.setLevel(logging.INFO) # 指明了將會分發日志的最低級別
#TimedRotatingFileHandler()按照時間自動分割日志文件
fh=TimedRotatingFileHandler(logFilename,when='D',interval=1,backupCount=3)
fh.suffix="%Y%m%d.log"
#Formatter對象設置日志信息最后的規則、結構和內容
formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
fh.setFormatter(formatter)#該處理器選擇一個格式化器
logger.addHandler(fh)# 把對象加到logger里
cs=logging.StreamHandler()#往屏幕上輸出
cs.setFormatter(formatter)#設置屏幕上顯示的格式
logger.addHandler(cs)# 把對象加到logger里
def application(environ,start_response):
#功能說明:服務端應用程序,實現實時獲取充值請求報文數據並保存至文件,返回請求響應報文並保存至文件中
#by xiaocc[2018-7-5]
#CONTENT_LENGTH 可能為空,或者沒有
#客戶端請求信息放到環境變量environ中
envdate = [
'%s: %s' % (key, value) for key, value in sorted(environ.items())
]
envdate = '\n'.join(envdate) # 由於下面將Content-Type設置為text/plain,所以`\n`在瀏覽器中會起到換行的作用
print '-------------------start-------------------'
print 'environment item values: \n',envdate
print '-------------------end-------------------'
print 'environment CONTENT-LENGTH is : ',environ.get('CONTENT_LENGTH')
try:
request_body_size=int(environ.get('CONTENT_LENGTH',0))
logging.info('notifyrequest_body_size: %s' % request_body_size)
except(ValueError):
request_body_size=0
logging.error('notifyrequest_body_size: %s' % request_body_size)
#通過 wsgi.input獲取請求數據
request_body=environ['wsgi.input'].read(request_body_size)
logging.info( '原始請求報文: %s' % request_body)
d=parse_qs(request_body)
logging.info( '處理后的客戶端發送的請求報文 notifyreqeust_body_data: %s' % d)
#生成請求響應報文
response_body='no response'
status='200 OK'
response_headers=[
('Content-Type','text/xml'),
('Content-Length',str(len(response_body)))
]
start_response(status, response_headers)
logging.info('成功發送響應報文到客戶端')
return [response_body]
console_log_out('log.txt')
httpd=make_server('', 8079, application) #可以根據需監聽的端口修改
logging.info('serving HTTP on port 8079.....')
httpd.serve_forever()
