0
点赞
收藏
分享

微信扫一扫

python 监听服务端的某端口报文收发情况

如下应用实现监听服务器上某个端口的报文收发情况:使用方法是将该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()

  

  



举报

相关推荐

0 条评论