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的更多相关文章

  1. D08——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D08 20180829内容纲要: socket网络编程 1  socket基础概念 2  socketserver 3  socket实现简单的SSH服务器端和 ...

  2. python 学习分享-实战篇高级的ftp

    #server代码 import socketserver,os,hashlib Base_paht = os.path.dirname(os.path.dirname(os.path.abspath ...

随机推荐

  1. 南京Uber优步司机奖励政策(7.20~7.26)

    人民优步奖励前提   *必须满足当周平均评分4.5星及以上,且当周接单率70%及以上,满足以上所有前提即可获得当周奖励 *刷单和红线行为立即封号并取消当周全部奖励及车费! 滴滴快车单单2.5倍,注册地 ...

  2. JavaScript---复选框反选全选

    Script <script type="text/javascript"> /*直接使用document.getElementsByName("c1&quo ...

  3. 13、Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  4. 创龙DSP6748学习之RS485收发

    1. 先看下原理图,第一个问题,RS485其实就是使用的串口USART1,同时485的输出脚之间接120欧姆的电阻. 遇到个问题,为什么有两个使能引脚?还有RS485_A和RS485_B为什么分别接上 ...

  5. nodejs HTTP服务

    nodejs中的HTTP服务   nodejs最重要的方面之一是具有非常迅速的实现HTTP和HTTPS服务器和服务的能力.http服务是相当低层次的,你可能要用到不同的模块,如express来实现完整 ...

  6. #3.14 Piday#我的圆周率日

    本文来自网易云社区 作者:马宝 圆周率日(Pi day) 2011年国际数学协会正式宣布,将每年的3月14日设为国际数学节,来源则是中国古代数学家祖冲之的圆周率."终极"圆周率日是 ...

  7. C#原型模式

    如下: [Serializable] public class ModelNewTable : ICloneable { public object Clone() { using (var stre ...

  8. sql注入--高权限,load_file读写文件

    select '<?php eval($_POST[123]) ?>' into outfile '/var/www/html/1.php'; 1.MYSQL新特性限制文件写入及替代方法 ...

  9. 【转】cocos2dx3.2学习笔记之Director(导演类)

    转载:https://blog.csdn.net/u013435551/article/details/38579747 在Cocos2d-x中,把统筹游戏大局的类抽象为导演类(Director),D ...

  10. Java开发工程师(Web方向) - 03.数据库开发 - 第1章.JDBC

    第1章--JDBC JDBC基础 通过Java Database Connectivity可以实现Java程序对后端数据库的访问 一个完整的数据库部署架构,通常是由客户端和服务器端两部分组成 客户端封 ...