python中的socket实现ftp客户端和服务器收发文件及md5加密文件
客户端向服务器发送一个请求,请求内容是一个文件名,服务器在查找自己这边有没有这个文件,如果有的话就发送给客户端
1、客户端
- 生成socket对象
- 建立连接
- 输入想要接收的文件
- 将输入的文件名发送给服务器
- 接收服务器发回的关于即将要发送来的文件的大小
- 发送一条信息给服务器告诉它准备好接收了
- 接收文件数据
- 打印全部接收的提示信息
client具体实现的代码如下:
#Author:Mr.Xue
#2019.10.29
#socket_ftp_client.py
importsocket
importhashlib
client=socket.socket()#生成socket连接对象
client.connect(('localhost',6961))#建立连接
whileTrue:
cmd=input(">>").strip()#输入想要接收的文件
iflen(cmd)==0:continue#输入为空,重新再输
ifcmd.startswith('get'):#判断指令是否以get开头
client.send(cmd.encode("utf-8"))#发送
server_response=client.recv(1024)#接收即将发送来的文件的大小
print("serverresponse:",server_response)#打印文件的大小
client.send(b'readytorecvfile...')#发送消息告诉服务已经准备好接收了
file_total_size=int(server_response.decode())#记录文件的总大小
received_size=0#记录已经接收了的文件的大小
filename=cmd.split()[1]#取出输入的文件名
f=open(filename+'.new','wb')#新建一个本地文件来存储接收的数据
m=hashlib.md5()#md5加密
whilereceived_size
client端比较难的一点和上篇一样,还是如何判断服务器端要发送的数据,客户端是否完全都接收过来了,实现逻辑在上面代码中,也可参考前一篇socket(二);在客户端这一次多了一个新的知识点,用md5来加密接收到的文件,先生成md5实例对象,再调用update()来加密文件,最后和服务器端的加密文件进行比较,看看是不是一样的。
2、服务器
- 生成socket连接对象
- 绑定要监听端口
- 监听
- 等待客户端的连接
- 接收客户端发来的文件名
- 查找这个文件是否存在
- 如果存在,打开文件计算大小,发送给客户端
- 等待客户端确认
- 发送文件具体内容给客户端
server具体实现代码如下:
#Author:Mr.Xue
#2019.10.29
#socket_ftp_server.py
importsocket,os,hashlib
server=socket.socket()#生成socket对象
server.bind(('localhost',6961))#绑定ip和端口
server.listen()#监听
whileTrue:
conn,addr=server.accept()#等待客户端连接
whileTrue:
print("等待接收文件名...")
data=conn.recv(1024)#接收客户端发来的信息
ifnotdata:#判断客户端是否断连
print('lostalink...')
break
cmd,filename=data.decode().split()#分割接收到的消息,提取出文件名
ifos.path.isfile(filename):#判断文件是否存在
f=open(filename,'rb')#打开文件
m=hashlib.md5()#md5加密对象
file_size=os.stat(filename).st_size#计算文件大小
conn.send(str(file_size).encode("utf-8"))#sendfilesize
conn.recv(1024)#waittheack预防粘包
forlineinf:
m.update(line)#加密
conn.send(line)#发送
print("filemd5:",m.hexdigest())#以16进制打印加密后的文件
f.close()#关闭文件
conn.send(m.hexdigest().encode("utf-8"))#以16进制发送加密后的文件
print('senddone')
socket.close()
服务器的具体实现逻辑和前一篇大体上没什么区别,主要处理细节诶变成了查找文件处理文件和加密文件
3、测试效果
启动服务器
xue@xue-MacBookAir:~/python_learn$python3socket_ftp_server.py
启动客户端
client
xue@xue-MacBookAir:~/python_learn$python3socket_ftp_client.py
>>
server
xue@xue-MacBookAir:~/python_learn$python3socket_ftp_server.py
等待接收文件名...
客户端发送想要接收的文件名
client
xue@xue-MacBookAir:~/python_learn$python3socket_ftp_client.py
>>geta.txt
serverresponse:b'90'
filerecvdone9090
md52232897a127542c1d0715e66e7ca57ccb'2232897a127542c1d0715e66e7ca57cc'
>>
server
xue@xue-MacBookAir:~/python_learn$python3socket_ftp_server.py
等待接收文件名...
filemd5:2232897a127542c1d0715e66e7ca57cc
senddone
等待接收文件名...
上面的服务器端在发送完数据之后,接着又发送了md5的加密文件,可能会发生粘包的情况,所以上面还存在改进的地方,将预防粘包的代码加进去就比较完美了。
总结
到此这篇关于python中的socket实现ftp客户端和服务器收发文件及md5加密文件的文章就介绍到这了,更多相关pythonsocket实现ftp收发文件md5加密文件内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!