Python socket模块ftp传输文件过程解析
这篇文章主要介绍了Pythonsocket模块ftp传输文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
使用环境:python3,window环境,需要在头部声明#-*-coding:utf-8-*-
实现功能:
将sever端所处文件夹的文件,传输到client端所处的文件夹中。
并且通过md5检测是否出错。
客户端命令的形式是:get文件名
client处的新文件是文件名.new
ftp_sever.py
importhashlib importsocket,os,time server=socket.socket() server.bind(('localhost',9999)) server.listen() whileTrue: print("Iamwaitingforconnection.") conn,addr=server.accept() print("newconn:",addr) whileTrue: print("等待新指令") data=conn.recv(1024) ifnotdata: print("客户端已断开") break cmd,filename=data.decode().split() print(filename) ifos.path.isfile(filename):#判断是否该文件名为文件 f=open(filename,"rb") m=hashlib.md5()#为md5准备 file_size=os.stat(filename).st_size#利用os.stat获取文件的大小 conn.send(str(file_size).encode())#sendfilesize conn.recv(1024)#等待确认,同时可以防止粘包。 forlineinf:#一行一行发送数据,同时更新md5 m.update(line)#不断更新md5 conn.send(line)#不断发送数据。 print("filemd5",m.hexdigest())#十六进制的md5 f.close() conn.send(m.hexdigest().encode())#sendmd5 print("senddone") server.close()
ftp_client.py
importsocket importhashlib client=socket.socket() client.connect(('localhost',9999)) whileTrue: cmd=input(">>:").strip()#形式getfilename iflen(cmd)==0:continue ifcmd.startswith("get"): client.send(cmd.encode())#发送命令,形式getfilename server_response=client.recv(1024)#接收文件大小信息 print("servrresponse:",server_response) client.send(b"readytorecvfile")#发送确认信息。 file_total_size=int(server_response.decode())#将文件大小int化。 received_size=0#初始化接收数据大小,为0 filename=cmd.split()[1]#获取文件名 f=open(filename+".new","wb")#以二进制形式写入 m=hashlib.md5()#为md5准备 whilereceived_size!=file_total_size: '''下面的if判断是用来完整接收文件,从而避免粘包。''' iffile_total_size-received_size>1024:#要收不止一次24size=102425else:#最后一次了,剩多少收多少26size=file_total_size-received_size27print("lastreceive:",size)28data=client.recv(size)#data只需要是一小个内存,大小为1k就好29received_size+=len(data)30m.update(data)#不断更新md531f.write(data)#不断写入32#print(file_total_size,received_size)33else:34new_file_md5=m.hexdigest()#获取十六进制的md535print("filerecvdone",received_size,file_total_size)36f.close()37server_file_md5=client.recv(1024)#接收md5值38print("serverfilemd5:",server_file_md5)39print("clientfilemd5:",new_file_md5)4041client.close()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。