因为工作需要,要在两台设备之间进行压力测试。即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@)
#Program:Socket_Server监听网络端口,接收Client发来的文件
#Version:2.0
#History:.1.28
#.2.1接收Client发来的文件并做MD5校验
importsocket,time,hashlib,os,base64,re
defCalcMD5(fineName,block_size=64*1024):
withopen(fineName,'rb')asf:
md5=hashlib.md5()
whileTrue:
data=f.read(block_size)
ifnotdata:
break
md5.update(data)
retmd5=md5.hexdigest()
print(retmd5)
returnretmd5
defmain(IP,Port,log,error_log):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((IP,Port))
s.listen(12)
print'Listenedon',socket.gethostname(),Port
reg=pile('filename:(.*?):(.*)::::')
whileTrue:
conn,addr=s.accept()
print(time.ctime(),'Connectedfrom',addr)
recvd=conn.recv(1024)
ifrecvd:
ss=reg.findall(recvd)
filename=ss[0][0]
md5=ss[0][1]
f=open(filename,'wb')
whileTrue:
data=conn.recv(1024)
ifnotdata:
break
ifdata=='EOF':
f.close()
log.write('%sReceived%s\n'%(time.ctime(),filename))
log.flush()
ifCalcMD5(filename)==md5:
print('%sReceivedSuccessfully!\n'%filename)
else:
error_log.write('%s%sReceviedfailed\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@)
#Program:Socket_Client连接网络端,并向网络端发送文件。
#Version:2.0
#History:.1.28
#.2.1Client向Server端发送文件及文件的MD5值
importsocket,hashlib
importtime,os,base64,os.path
defCalcMD5(fineName,block_size=64*1024):
withopen(fineName,'rb')asf:
md5=hashlib.md5()
whileTrue:
data=f.read(block_size)
ifnotdata:
break
md5.update(data)
retmd5=md5.hexdigest()
print(retmd5)
returnretmd5
defSendFile(s,filename):
print('Sending%s'%filename)
s.sendall('filename:%s:%s::::'%(filename,CalcMD5(filename)))
f=open(filename,'rb')
whileTrue:
chunk=f.read(chunksize)
ifnotchunk:
f.close()
print('%sSuccessfullySent%s\n'%(time.ctime(),filename))
break
s.sendall(chunk)
time.sleep(1)
s.sendall('EOF')
s.close()
defmain(dirname,IP,Port,MB=1024):
forfilenameinos.listdir(dirname):
ifos.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)