Socket_FTP
1. md5加密回顾:
import hashlib m=hashlib.md5() #创建md5对象
m.update(b'abcd') #生成加密串
m.update(b'efg')
print(m.hexdigest()) #打印加密串
m2=hashlib.md5()
m2.update(b'abcdefg')
print(m2.hexdigest())
7ac66c0f148de9519b8bd264312c4d64
7ac66c0f148de9519b8bd264312c4d64
FTP-Server
1.读取文件名
2.检测文件是否存在
3.打开文件
4.检测文件大小
5.发送文件大小给客户端
6.等待客户端确定,防止粘包
7.开始边读边发数据
8.发送md5
9.关闭文件
2. FTP入门版:
服务器端:
import socket,os,time,hashlib server=socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
conn,addr=server.accept()
print("new connection is :",addr)
while True:
data=conn.recv(1024)
if not data:
print("客户端已经断开")
break
cmd,filename=data.decode().split() #分割get hash.py,把get赋值给cmd,把hash.py赋值给filename
print(filename)
if os.path.isfile(filename): #判断是否是文件
f=open(filename,'rb') #以二进制,读模式打开文件
m=hashlib.md5() #创建md5对象
file_size=os.stat(filename).st_size #获取文件大小
conn.send(str(file_size).encode()) #给客户端发送文件大小
conn.recv(1024) #等待客户端的确认
for line in f:
conn.send(line)
f.close() server.close()
客户端:
import socket client=socket.socket()
client.connect(('localhost',9999))
while True:
cmd=input(">>:").strip()
if len(cmd)==0:
continue
if cmd.startswith('get'): #代表接收什么文件
client.send(cmd.encode())
server_response=client.recv(1024) #接收的是文件大小
print("server response:",server_response)
client.send(b'ready to recv file') #给服务器端发确认信息,已经收到文件大小
file_total_size=int(server_response.decode())
received_size=0
filename=cmd.split()[1]
f=open(filename+'.new','wb') #以二进制打开一个文件,只用于写入。
while received_size<file_total_size:
data=client.recv(1024)
received_size=received_size+len(data)
f.write(data)
print(file_total_size,received_size)
else:
print('file recv done')
f.close() client.close()
客户端的输入及运行结果:
>>:get hash.py
server response: b'211'
211 211
file recv done
>>:
服务器端的运行结果:
new connection is : ('127.0.0.1', 65194)
hash.py
3. FTP+MD5验证
服务器端:
import socket,os,time,hashlib server=socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
conn,addr=server.accept()
print("new connection is :",addr)
while True:
data=conn.recv(1024)
if not data:
print("客户端已经断开")
break
cmd,filename=data.decode().split()
print(filename)
if os.path.isfile(filename): #判断是否是文件
f=open(filename,'rb') #打开文件
m=hashlib.md5() #创建md5对象
file_size=os.stat(filename).st_size #获取文件大小
conn.send(str(file_size).encode()) #发送文件大小
conn.recv(1024) #等待客户端的确认
for line in f:
m.update(line) #生产加密串
conn.send(line)
print('file md5',m.hexdigest())
f.close()
conn.send(m.hexdigest().encode('utf-8')) #send md5 server.close()
客户端:
import socket,hashlib
import hashlib client=socket.socket()
client.connect(('localhost',9999))
while True:
cmd=input(">>:").strip()
if len(cmd)==0:
continue
if cmd.startswith('get'): #代表接收什么文件
client.send(cmd.encode())
server_response=client.recv(1024)
print("server response:",server_response) #接收的是文件大小
client.send(b'ready to recv file')
file_total_size=int(server_response.decode())
received_size=0
filename=cmd.split()[1]
f=open(filename+'.new','wb')
m=hashlib.md5() while received_size<file_total_size:
data=client.recv(1024)
received_size=received_size+len(data)
f.write(data)
m.update(data)
#print(file_total_size,received_size)
else:
new_file_md5=m.hexdigest()
print('file recv done',received_size,file_total_size)
f.close()
server_file_md5=client.recv(1024)
print('server file md5:',server_file_md5)
print('client file md5:',new_file_md5) client.close()
服务器端运行结果:
new connection is : ('127.0.0.1', 65466)
hash.py
file md5 5dbf115019480585de4d39cd175184db
客户端运行结果:
>>:get hash.py
server response: b'211'
file recv done 211 211
server file md5: b'5dbf115019480585de4d39cd175184db'
client file md5: 5dbf115019480585de4d39cd175184db
4.FTP+MD5验证+粘包处理:
服务器端:
import socket,os,time,hashlib server=socket.socket()
server.bind(('localhost',9999))
server.listen()
while True:
conn,addr=server.accept()
print("new connection is :",addr)
while True:
data=conn.recv(1024)
if not data:
print("客户端已经断开")
break
cmd,filename=data.decode().split()
print(filename)
if os.path.isfile(filename): #判断是否是文件
f=open(filename,'rb') #打开文件
m=hashlib.md5() #创建md5对象
file_size=os.stat(filename).st_size #获取文件大小
conn.send(str(file_size).encode()) #发送文件大小
conn.recv(1024) #等待客户端的确认
for line in f:
m.update(line) #生产加密串
conn.send(line)
print('file md5',m.hexdigest())
f.close()
conn.send(m.hexdigest().encode('utf-8')) #send md5 server.close()
客户端:
import socket,hashlib
import hashlib client=socket.socket()
client.connect(('localhost',9999))
while True:
cmd=input(">>:").strip()
if len(cmd)==0:
continue
if cmd.startswith('get'): #代表接收什么文件
client.send(cmd.encode())
server_response=client.recv(1024)
print("server response:",server_response) #接收的是文件大小
client.send(b'ready to recv file')
file_total_size=int(server_response.decode())
received_size=0
filename=cmd.split()[1]
f=open(filename+'.new','wb')
m=hashlib.md5() while received_size<file_total_size:
if file_total_size-received_size>1024: #要收不止一次
size=1024
else: #最后一次了,剩多少收多少
size=file_total_size-received_size
print("last receive:",size)
data=client.recv(size)
received_size=received_size+len(data)
f.write(data)
m.update(data)
#print(file_total_size,received_size)
else:
new_file_md5=m.hexdigest()
print('file recv done',received_size,file_total_size)
f.close()
server_file_md5=client.recv(1024)
print('server file md5:',server_file_md5)
print('client file md5:',new_file_md5) client.close()
服务器端的输出:
new connection is : ('127.0.0.1', 56460)
hash.py
file md5 5dbf115019480585de4d39cd175184db
客户端的输出:
>>:get hash.py
server response: b'211'
last receive: 211
last receive: 2
file recv done 211 211
server file md5: b'5dbf115019480585de4d39cd175184db'
client file md5: 5dbf115019480585de4d39cd175184db
Socket_FTP的更多相关文章
- D08——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D08 20180829内容纲要: socket网络编程 1 socket基础概念 2 socketserver 3 socket实现简单的SSH服务器端和 ...
- python 学习分享-实战篇高级的ftp
#server代码 import socketserver,os,hashlib Base_paht = os.path.dirname(os.path.dirname(os.path.abspath ...
随机推荐
- 成都Uber优步司机奖励政策(3月21日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- spring源码-Aware-3.4
一.Aware接口,这个也是spring的拓展之一,为啥要单独拿出来讲呢,因为他相比于BeanFactoryPostProcessor,BeanPostProcessor的实用性更加高,并且在具体的业 ...
- element-ui 分页注意事项
<template> <div id="monitor"> 一页显示 {{currentCount}}条 当前第 {{currentPage}}页 < ...
- EDM站点
设计邮件模版 http://templates.mailchimp.com/
- python编程os、os.path 模块中关于文件、目录常用的函数使用方法
os模块中关于文件/目录常用的函数使用方法 函数名 使用方法 getcwd() 返回当前工作目录 chdir(path) 改变工作目录 listdir(path='.') 列举指定目录中的文件名( ...
- lesson 16 Mary had a little lamb
lesson 16 Mary had a little lamb a little + 可数 小的;+ 不可数 少量的 对于动物在幼时都有不同的称呼: calf 小牛 lamb 羊羔 piglet 小 ...
- 剑指offer-二叉搜索树的后序遍历序列23
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. class Solution: def Verif ...
- 如何让thinkpad X1C 用U盘 安装上专业版win10
1 BIOS内置了文件 会导致win10 iso默认装家庭版 2 给iso 的resouse 目录中增加文件ei.cfg 3 内容如下 [EditionID]Professional[Channel] ...
- 正确使用memset
今天做了一道素数打表的题我在使用一个数组记录是否为素数的时候使用了memset,将数组里面的数都清为1,代表是素数,不是素数,就改成0,我在判断这一个数是否为素数是依据也是是0还是1,结果一直存在问题 ...
- php5.4以上运行yii框架出现问题的解决方法
Ubuntu Server 下安装 Mcrypt Php Extension http://blog.archean.me/2013/10/22/install-mcrypt-php-extensio ...