[terry笔记]python FTP
如下是作业,用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的更多相关文章
- [terry笔记]Python字符串
如下学习python的字符串用法. print(dir(str)) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', ...
- [terry笔记]python内置函数
总结一下内置函数,Build-in Function. 一.数学运算类 abs(x) 求绝对值 complex([real[, imag]]) 创建一个复数 divmod(a, b) 分别取商和余数注 ...
- [terry笔记]python三级菜单
把三级菜单输出,选择后逐层显示,”b“返回上一级菜单. menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村': ...
- [terry笔记]python购物程序
如下是一个购物程序: 先输入工资,显示商品列表,购买,quit退出,最后格式化输出所买的商品. count = 0 while True: #做一个循环判断,如果输入的不是数字,基于提示,三次后退出 ...
- [terry笔记]RMAN综合学习之恢复
[terry笔记]RMAN综合学习之备份http://www.cnblogs.com/kkterry/p/3308405.html [terry笔记]RMAN综合学习之恢复 http://www.cn ...
- [terry笔记]RMAN综合学习之备份
rman是最经济实惠的oracle备份工具,在这里做一个rman的整体学习. 文章中大多是rman命令的语法,还是最好做做实验,以便印象深刻,因为大多数数据库的备份就是按时跑脚本,恢复也不是经常能遇到 ...
- [terry笔记]RMAN综合学习之配置
[terry笔记]RMAN综合学习之备份http://www.cnblogs.com/kkterry/p/3308405.html [terry笔记]RMAN综合学习之恢复 http://www.cn ...
- [terry笔记]Oracle会话追踪(二):TKPROF
接上一笔记[terry笔记]Oracle会话追踪(一):SQL_TRACE&EVENT 10046 http://www.cnblogs.com/kkterry/p/3279282.html ...
- [terry笔记]Oracle会话追踪(一):SQL_TRACE&EVENT 10046
SQL_TRACE/10046 事件是 Oracle 提供的用于进行 SQL 跟踪的手段,在日常的数据库问题诊断和解决中是非常常用的方法.但其生成的trace文件需要tkprof工具生成一个可供人 ...
随机推荐
- nodejs-Module
nodejs的打包程序 模块:实现特定功能的文件 1.通过require引入模块 2.模块中的功能(变量,函数),通过赋给exports对象的某个属性提供给调用者使用 1 2 function sum ...
- 工具-常用VS插件
工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件,内存管理,诊断工具等,涉及开发过程的各个环节, ...
- 单词数 (STL set集合)
单词数 Problem Description lily的好朋友xiaoou333近期非常空.他想了一件没有什么意义的事情.就是统计一篇文章里不同单词的总数.以下你的任务是帮助xiaoou333解决问 ...
- Linux安装vmtools
unbantu下,先把DVD的Vmwarew.gz,文件拷贝到tmp文件.然后 tar zxf VMware Tools-0....... ls cd ./intall.pl 有个文件,先拷贝到roo ...
- 2015.04.29,外语,读书笔记-《Word Power Made Easy》 14 “如何谈论日常现象” SESSION 39
HOW TO TALK ABOUT COMMON PHENOMENA AND OCCURRENCES TEASER PREVIEW dire(['daiә(r)] adj. 可怕的,悲惨的,灾难警告的 ...
- Foundation框架经常使用数据类型和NSAutoreleasePool自己主动释放池解析
第一.NSAutoreleasePool自己主动释放池解析 1.自己主动释放池的物理实现 自己主动释放池用栈来实现.当你创建一个新的自己主动释放池是,会压栈到栈顶.接受autorelease消息的对象 ...
- 关于ubuntu中文输入调用不出来的解决办法,具体如正文。
卸载了 fcitx sudo apt-get remove fcitx 重启 sudo reboot 重新安装 fcitxsudo apt-get install fcitx 安装拼音输入法sudo ...
- Java NIO(五)套接字通道
Socket通道 Socket通道和文件通道有着不一样的特征: Socket通道类可以运行于非阻塞模式,并且是可选的.这两个特征可以激活大程序(如网络服务和中间件组件)巨大的可伸缩性和灵活性,因此再也 ...
- windows下git server搭建
使用gitblit1.8搭建 首先要安装JDK 然后下载gitblit,这里给一个CSDN下载 https://download.csdn.net/download/nietzsche0/104826 ...
- Win7下安装Flash低版本
我把HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayer\SafeVersions中高于要装的版本的项目都删了,还是不行. 看了这个帖子后发现,原来64 ...