如下是作业,用python做一个ftp,主要利用socket。

server端在linux下运行,在client端可以执行shell命令(静态的)

在client端输入get xxx,即可下载。

在client端输入put xxx,即可上传。

server端:

 import socket
import subprocess
import os
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("0.0.0.0",8000))
server.listen(5)
print("start to listen".center(30,"-")) while True:
conn,client_addr = server.accept()
print(conn,client_addr)
while True:
try:
data = conn.recv(1024)
print("receive from client :",data)
if (data.decode()).startswith("get"):
data_cmd = data.decode()
data_cmd_list = data_cmd.split(" ")
file_name = data_cmd_list[-1]
conn.send(str(os.path.getsize(file_name)).encode())
f = open(file_name,"rb")
f_data = f.readlines()
for line in f_data:
conn.send(line)
elif (data.decode()).startswith("put"):
data_size = conn.recv(1024)
if data_size.decode() == "no file":
continue
print("The file's size is %sM" % round(int(data_size.decode()) / 1024 / 1024, 2))
data_list = (data.decode()).split(" ")
file_name = data_list[-1]
f = open(file_name, "wb")
total_size = int(data_size.decode())
file_size = 0
while True:
data2 = conn.recv(1024)
f.write(data2)
file_size += len(data2)
if file_size == total_size:
break
f.close()
print("file upload done")
else:
res_obj = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
res = res_obj.stdout.read()
conn.send(str(len(res)).encode())
print("--res len :",len(res))
conn.send(res)
except ConnectionResetError as e:
print(client_addr,"is break")
break
except FileNotFoundError as e:
print("there is no such file!")
conn.send(b"no file")
continue

client端:

 import socket
import os
client = socket.socket()
client.connect(("192.168.168.128",8000))
# client.connect(("localhost",8000)) while True:
try:
msg = input(">>>>>").strip()
if len(msg) == 0: continue
client.send(msg.encode())
if msg.startswith("get"):
data = client.recv(1024)
if data.decode() == "no file":
print("there is no such file!")
continue
else:
print("The file's size is %sM" % round(int(data.decode())/1024/1024,2))
msg_list = msg.split(" ")
file_name = msg_list[-1]
f = open(file_name,"wb")
total_size = int(data.decode())
file_size = 0
while True:
data2 = client.recv(1024)
f.write(data2)
file_size += len(data2)
if file_size == total_size:
break
f.close()
elif msg.startswith("put"):
msg_cmd_list = msg.split(" ")
file_name = msg_cmd_list[-1]
client.send(str(os.path.getsize(file_name)).encode())
f = open(file_name, "rb")
f_data = f.readlines()
for line in f_data:
client.send(line)
else:
data = client.recv(1024)
print("client receive:", data.decode())
total_size = int(data.decode())
received_size = 0
res = b""
while received_size < total_size:
d = client.recv(1024)
res += d
received_size += len(d)
print("-----receive done-----")
print(res.decode())
except FileNotFoundError as e:
print("There is no such file!")
client.send(b"no file")
continue

[terry笔记]python FTP的更多相关文章

  1. [terry笔记]Python字符串

    如下学习python的字符串用法. print(dir(str)) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', ...

  2. [terry笔记]python内置函数

    总结一下内置函数,Build-in Function. 一.数学运算类 abs(x) 求绝对值 complex([real[, imag]]) 创建一个复数 divmod(a, b) 分别取商和余数注 ...

  3. [terry笔记]python三级菜单

    把三级菜单输出,选择后逐层显示,”b“返回上一级菜单. menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村': ...

  4. [terry笔记]python购物程序

    如下是一个购物程序: 先输入工资,显示商品列表,购买,quit退出,最后格式化输出所买的商品. count = 0 while True: #做一个循环判断,如果输入的不是数字,基于提示,三次后退出 ...

  5. [terry笔记]RMAN综合学习之恢复

    [terry笔记]RMAN综合学习之备份http://www.cnblogs.com/kkterry/p/3308405.html [terry笔记]RMAN综合学习之恢复 http://www.cn ...

  6. [terry笔记]RMAN综合学习之备份

    rman是最经济实惠的oracle备份工具,在这里做一个rman的整体学习. 文章中大多是rman命令的语法,还是最好做做实验,以便印象深刻,因为大多数数据库的备份就是按时跑脚本,恢复也不是经常能遇到 ...

  7. [terry笔记]RMAN综合学习之配置

    [terry笔记]RMAN综合学习之备份http://www.cnblogs.com/kkterry/p/3308405.html [terry笔记]RMAN综合学习之恢复 http://www.cn ...

  8. [terry笔记]Oracle会话追踪(二):TKPROF

    接上一笔记[terry笔记]Oracle会话追踪(一):SQL_TRACE&EVENT 10046 http://www.cnblogs.com/kkterry/p/3279282.html ...

  9. [terry笔记]Oracle会话追踪(一):SQL_TRACE&EVENT 10046

      SQL_TRACE/10046 事件是 Oracle 提供的用于进行 SQL 跟踪的手段,在日常的数据库问题诊断和解决中是非常常用的方法.但其生成的trace文件需要tkprof工具生成一个可供人 ...

随机推荐

  1. @value 注解获取属性文件中的值

    一.属性文件 db.properties name=jack 二.配置文件 applicationContext.xml <!-- 加载配置文件,该节点只能存在一个,所以用 * ,加载所有属性文 ...

  2. JavaScript 事件对内存和性能的影响

    程序代码: <%-- Created by IntelliJ IDEA. User: 乔克叔叔 Date: 2017/12/26 Time: 16:45 To change this templ ...

  3. 请用Java设计一个Least Recently Used (LRU) 缓存

    LRU介绍:LRU是Least Recently Used的缩写,即最少使用页面置换算法,是为虚拟页式存储管理服务的, 思路介绍: 能够使用两个标准的数据结构来实现.Map和Queue.由于须要支持多 ...

  4. Android recovery UI实现分析

    Android recovery模式为何物? 关于这个问题, baidu上已经有无数的答案.不理解的朋友先补习一下. 从纯技术角度来讲, recovery和android本质上是两个独立的rootfs ...

  5. iOS-UIImageView载入网络下载的图片(异步+多线程)

    最原始的载入网络下载的图片方式: //最原始载入网络图片方法,相当堵塞主线程,界面卡顿 -(void)setImageWithURL:(NSString *)imageDownloadUrl{ UII ...

  6. UVA - 11021 - Tribles 递推概率

    GRAVITATION, n.“The tendency of all bodies to approach one another with a strengthproportion to the ...

  7. 英语发音规则---H字母

    英语发音规则---H字母 一.总结 一句话总结: 1.H发[h]音? hot [hɒt] adj. 热的 house [haʊs] n. 住宅 head [hed] n. 头:头痛 hat [hæt] ...

  8. EOJ 3124 单词表

    题目描述 提取英文文本中的单词,重复出现的单词只取一个,把它们按照字典顺序排序,建立为一个单词表. 例如:英文文本如下: “ask not what your country can do for y ...

  9. HttpClient简单操作

    HttpClient 这个框架主要用来请求第三方服务器,然后获取到网页,得到我们需要的数据: HttpClient设置请求头消息User-Agent模拟浏览器 比如我们请求 www.tuicool.c ...

  10. ROS-SLAM仿真-hector

    前言:hector_slam可以很好的在空中机器人,手持构图设备及特种机器人中运行. hector_slam不需要订阅里程计信息/odmo消息,而是直接使用激光估算里程计信息,因此,当机器人速度较快时 ...