如下是作业,用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

最新文章

  1. Win7 64位下PowerDesigner连接64位Oracle11g数据库
  2. MySQL学习笔记(2/2)
  3. Cach&#233;数据库学习笔记(5)
  4. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q84-Q87)
  5. 【原创】“借贷宝”砸钱,邀请码 GZZKZK2 (注册成功每人可得20现金,可直接提现)。。。而这只是开始
  6. C#使用 UdpClient 类进行简单通信的例子
  7. php sql分离
  8. my.cnf 中字符集设置
  9. yum使用详细
  10. Linux Shell编程(16)——循环
  11. Java基础知识强化之集合框架笔记29:使用LinkedList实现栈数据结构的集合代码(面试题)
  12. STM8建立IAR工程
  13. 基于.NET CORE微服务框架 -Api网关服务管理
  14. Rafy 开源贡献中心 - 组织成立,并试运行一月小结
  15. 《ServerSuperIO Designer IDE使用教程》- 6.增加与阿里云物联网(IOT)对接服务,实现数据交互。发布:v4.2.4 版本
  16. Python之路(第十七篇)logging模块
  17. apply,call以及bind的区别
  18. 异步async、await和Future的使用技巧
  19. 安卓自动化测试——rf
  20. jQuery 基础与运用

热门文章

  1. JavaScript(DOM编程二)
  2. java spring中对properties属性文件加密及其解密
  3. java import跨包引用类理解
  4. 使用gridlayout布局后,因某些原因又删除,并整理文件夹结构时,Unable to resolve target &amp;#39;android-7&amp;#39;
  5. 积跬步,聚小流------Bootstrap学习记录(1)
  6. VMware-workstation安装
  7. ShareREC for iOS v1.0.4 已经公布
  8. 创建逻辑dg
  9. word2010无法显示endnote x7插件及破解endnote x7
  10. USACO 2.2 Preface Numbering