700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > python实现文件传输_Python使用socket实现简单的文件传输并校验

python实现文件传输_Python使用socket实现简单的文件传输并校验

时间:2020-08-30 22:53:28

相关推荐

python实现文件传输_Python使用socket实现简单的文件传输并校验

因为工作需要,要在两台设备之间进行压力测试。即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)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。