服务器端

'''
1.读取文件名
2.检测文件是否存在
3.打开文件
4.检测文件大小
5.发送文件大小给客户端
6.等客户端确认
7.开始边读边发数据
8.发送md5
'''
import socket,os,time,hashlib
server=socket.socket()
server.bind(('0.0.0.0',9999))
server.listen() while True:
conn, addr = server.accept()
print("new conn:",addr)
# print("recv:%s" % data)
while True:
print("等待新指令:")
data = conn.recv(10240)#[1]收到的是比特流
if not data:
print("客户端已断开")
break
cmd, filename = data.decode().split()#比特流解码之后按照空格分割成"命令,文件名"
print("文件名:", filename)
if os.path.isfile(filename):#判断文件名是否存在
f = open (filename, 'rb')
m = hashlib.md5()
file_size = os.stat(filename).st_size
#print(type(file_size)) #int
conn.send (str (file_size).encode ()) # [2]发送文件大小
print("[服务器发送的文件大小]",str(file_size).encode())
conn.send(str(file_size).encode())#[2]发送文件大小
#conn.send(str(len(file_size.encode())).encode("utf-8")) # 发送文件大小
#conn.send(file_size.encode())
conn.recv(1024)#等待ack[3]
# for line in f:
for line in f:
m.update(line)
#line = f.readline(1024)
conn.send(line) # [4]服务器端一行一行发送
print("发送的数据:",line.decode())
print("文件md5值",m.hexdigest())
#conn.send(m.hexdigest().encode())#[4]发送md5
f.close()
print("send done") server.close() 客户端
import socket,os,sys,hashlib

client = socket.socket()
client.connect(('localhost', 9999)) while True:
cmd = input("input the filename>>>").strip()
if len(cmd)== 0: continue
if cmd.startswith("get"):#以'get'开头才行
client.send(cmd.encode())#[1]输入的是字符串.实际发送的是比特流
server_response=client.recv(1024)#[2]客户端收到来自服务器发送的文件的大小
print("[server_response]文件大小:",server_response)
client.send(b"ready to accept......")#[3]
file_total_size=int(server_response.decode())#因为收到来自服务器的是个比特流,所以要先解码,完了之后将其变成整数,方便下面的比较
print("[file_total_size]:",file_total_size)
received_size=0
# received_data=b''
filename=cmd.split()[1]
f=open(filename+".new","wb")
m=hashlib.md5()
while received_size != file_total_size:
data=client.recv(1024)#[4]客户端收到数据
received_size += len (data) # 每次收到的有可能小于1024,所以必须用len判断
print ("文件总大小:%s,已收到文件大小:%s" % (file_total_size, received_size))
f.write(data)
print("data类型:",type(data))
print("data.decode类型:",type(data.decode()))#收到的数据解码之后是字符类型
print("当前文件大小",len(data.decode()))
#received_data+=data
m.update(data)
#print(data.decode())
else:
new_file_md5=m.hexdigest()
print("cmd res raceive done...",received_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()

python简单的ftp程序的更多相关文章

  1. Python简单基础小程序

    1 九九乘法表 for i in range(9):#从0循环到8 i += 1#等价于 i = i+1 for j in range(i):#从0循环到i j += 1 print(j,'*',i, ...

  2. 用python开发简单ftp程序

    根据alex老师视频开发的简单ftp程序,只能实现简单的get功能 ftp客户端程序: #!/usr/bin/env python #_*_ coding:utf-8 _*_ import socke ...

  3. python实现FTP程序

    python实现FTP程序 程序源码 上传功能 查看文件 cd功能 创建目录 程序源码 目录结构 服务端 主程序 import optparse import socketserver import ...

  4. Python开发程序:FTP程序

    作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp se ...

  5. python简单的监控脚本-利用socket、psutil阻止远程主机运行特定程序

    python简单的监控脚本-利用socket.psutil阻止远程主机运行特定程序 psutil是一个跨平台的库(http://code.google.com/p/psutil/),能够轻松的实现获取 ...

  6. 用python写个简单的小程序,编译成exe跑在win10上

    每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...

  7. (转)Python开发程序:支持多用户在线的FTP程序

    原文链接:http://www.itnose.net/detail/6642756.html 作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ...

  8. [ python ] 项目一:FTP程序

    声明: 该项目参考学习地址: http://www.cnblogs.com/lianzhilei/p/5869205.html , 感谢博主分享,如有侵权,立即删除. 作业:开发一个支持多用户在线的F ...

  9. Python开发【项目】:FTP程序

    作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp se ...

随机推荐

  1. Flask web开发之路六

    紧接着上篇文档,写模板继承和block,URL链接和加载静态文件 模板继承和block 项目结构 主app文件代码: from flask import Flask,render_template a ...

  2. favicon.ico 网站小图标标识

    随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,这个图标是:,也就是我们常说的favicon.ico. 由于这篇文章主要讨论favico ...

  3. Android编译系统入门(二)

    Android.mk的使用方法 在上一篇Android编译系统入门(一)中我们只要介绍了Android系统使用make命令默认编译的依赖树是droid,而droid是一个伪目标,它有两个先决条件dro ...

  4. myeclipse编译弹框:The builder launch configuration could not be found

    myEclipse 每次编译时报 "The builder launch configuration could not be found" 的弹框:不影响项目编译启动,但是弹框挺 ...

  5. vim保存只读文件时获得sudo权限

    有时使用vim时忘记输入sudo,导致编辑了一大堆文字,最后保存时发现是只读文件,无法保存,每次保存都会提示read only.这时可以使用如下命令代替原有的 :wq 命令 :w !sudo tee ...

  6. [No000010E]Git7/9-标签管理

    发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照 ...

  7. Vue SSR 配合Java的Javascript引擎j2v8实现服务端渲染4支持构建bundle

    安装 webpack-node-externals yarn add -D webpack-node-externals

  8. C语言中点操作符(.)和箭头操作符(->)

    C语言中点操作符(.)和箭头操作符(->) 点说语法不太准确,许多都称该之为点运算符/操作符,箭头运算符/操作符.但是OC中叫点语法,感觉理解起来还蛮舒服.毕竟基础的C操作符中是 相同点 两个都 ...

  9. JQuery中数组的创建与使用

    一.创建数组的方式: 1.定义并赋值 var str = ['java', 'php', 'c++', 'c#', 'perl', 'vb', 'html', 'css']; 2.用{}定义后赋值: ...

  10. 使用Dom4j的xPath解析xml文件------xpath语法

    官方语法地址:http//www.w3school.com.cn/xpath/index.asp xpath使用路径表达式来选取xml文档中的节点或节点集.节点是通过沿着路径(path)或者步(ste ...