因为工作需要,要在两台设备之间进行压力测试。即A设备不断往B设备发送文件,B设备接收文件后校验文件是否正确接收。
用Python的socket模块写了简单的Server和Client脚本。Server负责监听端口,接收Client发来的文件并做MD5校验,确认接收的文件是否准确无误。Client端负责向Server发送文件及文件的MD5值。
文件名通过Client发送特定字符串提取,文件结束符合通过检测'EOF'字符实现。实际运行过程中,发现总是会有误判,把结束符'EOF'错误写入文件了。希望有大神不吝赐教!!
Socket_Server.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Python: 2.7
# Platform: Linux
# Author: wucl(wucl-20@163.com)
# Program: Socket_Server监听网络端口,接收Client发来的文件
# Version: 2.0
# History: 2016.1.28
# 2016.2.1 接收Client发来的文件并做MD5校验
import socket, time, hashlib, os, base64, re
def CalcMD5(fineName, block_size=64 * 1024):
with open(fineName, 'rb') as f:
md5 = hashlib.md5()
while True:
data = f.read(block_size)
if not data:
break
md5.update(data)
retmd5 = md5.hexdigest()
print(retmd5)
return retmd5
def main(IP, Port, log, error_log):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((IP, Port))
s.listen(12)
print 'Listened on ', socket.gethostname(), Port
reg = re.compile('filename:(.*?):(.*)::::')
while True:
conn, addr = s.accept()
print(time.ctime(), 'Connected from ', addr)
recvd = conn.recv(1024)
if recvd:
ss = reg.findall(recvd)
filename = ss[0][0]
md5 = ss[0][1]
f = open(filename, 'wb')
while True:
data = conn.recv(1024)
if not data:
break
if data == 'EOF':
f.close()
log.write('%s Received %s\n'%(time.ctime(), filename))
log.flush()
if CalcMD5(filename) == md5:
print('%s Received Successfully!\n' %filename)
else:
error_log.write('%s %s Recevied failed\n'%(time.ctime(), filename))
error_log.flush()
print(CalcMD5(filename))
else:
f.write(data)
f.flush()
conn.close()
s.close()
if __name__ == "__main__":
IP = ''
Port = 12345
log = open('log.txt','w+')
error_log = open('error_log.txt','w+')
main(IP, Port, log, error_log)
Socket_Client.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Python: 2.7
# Platform: Linux
# Author: wucl(wucl-20@163.com)
# Program: Socket_Client连接网络端,并向网络端发送文件。
# Version: 2.0
# History: 2016.1.28
# 2016.2.1 Client向Server端发送文件及文件的MD5值
import socket, hashlib
import time, os, base64, os.path
def CalcMD5(fineName, block_size=64 * 1024):
with open(fineName, 'rb') as f:
md5 = hashlib.md5()
while True:
data = f.read(block_size)
if not data:
break
md5.update(data)
retmd5 = md5.hexdigest()
print(retmd5)
return retmd5
def SendFile(s, filename):
print('Sending %s' % filename)
s.sendall('filename:%s:%s::::'%(filename, CalcMD5(filename)))
f = open(filename, 'rb')
while True:
chunk = f.read(chunksize)
if not chunk:
f.close()
print('%s Successfully Sent %s\n' %(time.ctime(), filename))
break
s.sendall(chunk)
time.sleep(1)
s.sendall('EOF')
s.close()
def main(dirname, IP, Port, MB = 1024):
for filename in os.listdir(dirname):
if os.path.isfile(filename):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IP, Port))
SendFile(s, filename)
if __name__ == '__main__':
dirname = '/root/test/'
IP = '10.88.106.200'
Port = 12345
MB = 1024
chunksize = int(MB*1024*1024)
main(dirname, IP, Port, MB)