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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。