[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工具生成一个可供人 ...
随机推荐
- eclipse 去掉Eclipse打开后定期弹出Usage Data Upload对话框
Eclipse 的 UDC 老定期蹦出来说要上传使用数据到 eclipse 官网服务器去除方法: 1.删除 eclipse/plugins 目录下以 org.eclipse.epp.usagedata ...
- spring mvc流程理解
1.controller处理的终究就是一个结果,默认是modelandview对象,controller里自己随便调用service或者dao,终究都还是在controller里有返回值. 2. 在 ...
- tableView计算动态行高的总结
研究tableView怎么计算动态行高研究了两天一直还不太会,今天最终做出来了想要的效果. 首先.我在网上搜集了非常多资料,各种大神的总结,然后開始看.研究.试验,基本思路都是一样的. 1.一定要将l ...
- Android编程获取手机型号,本机电话号码,sdk版本号及firmware版本号号(即系统版本号号)
Android开发平台中,可通过TelephonyManager 获取本机号码. TelephonyManager phoneMgr=(TelephonyManager)this.getSystemS ...
- 数据库SQL Server2012笔记(三)——表的复杂查询
1.数据分组--max/min/avg/sum/count select avg(字段名),sum(字段名) from 表名 select count(*) from 表名 select ...
- UVA 10593 Kites DP
The season of flying kites is well ahead. So what? Let us make an inventory for kites. We are givena ...
- tflearn中一些CNN RNN的例子
lstm.py # -*- coding: utf-8 -*- """ Simple example using LSTM recurrent neural networ ...
- Oracle 11G R2 RAC中的scan ip 的用途和基本原理
Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...
- Mongo——C#操作
自己练手写了一个MongoDb的泛型类,顺便把一些常用命令整理了一下,做个记录: /// <summary> /// Mongo操作类. /// </summary> /// ...
- Unity3D项目
Input.mousePosition //鼠标点击的位置 0 左键 1右键 2滚轮 Input.GetMouseButton(0) //当鼠标左键处于按下状态的时候返回True Input.Ge ...