[terry笔记]python FTP

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

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

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

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

server端:

 1 import socket
 2 import subprocess
 3 import os
 4 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 5 server.bind(("0.0.0.0",8000))
 6 server.listen(5)
 7 print("start to listen".center(30,"-"))
 8
 9 while True:
10     conn,client_addr = server.accept()
11     print(conn,client_addr)
12     while True:
13         try:
14             data = conn.recv(1024)
15             print("receive from client :",data)
16             if (data.decode()).startswith("get"):
17                 data_cmd = data.decode()
18                 data_cmd_list = data_cmd.split(" ")
19                 file_name = data_cmd_list[-1]
20                 conn.send(str(os.path.getsize(file_name)).encode())
21                 f = open(file_name,"rb")
22                 f_data = f.readlines()
23                 for line in f_data:
24                     conn.send(line)
25             elif (data.decode()).startswith("put"):
26                 data_size = conn.recv(1024)
27                 if data_size.decode() == "no file":
28                     continue
29                 print("The file‘s size is %sM" % round(int(data_size.decode()) / 1024 / 1024, 2))
30                 data_list = (data.decode()).split(" ")
31                 file_name = data_list[-1]
32                 f = open(file_name, "wb")
33                 total_size = int(data_size.decode())
34                 file_size = 0
35                 while True:
36                     data2 = conn.recv(1024)
37                     f.write(data2)
38                     file_size += len(data2)
39                     if file_size == total_size:
40                         break
41                 f.close()
42                 print("file upload done")
43             else:
44                 res_obj = subprocess.Popen(data,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
45                 res = res_obj.stdout.read()
46                 conn.send(str(len(res)).encode())
47                 print("--res len :",len(res))
48                 conn.send(res)
49         except ConnectionResetError as e:
50             print(client_addr,"is break")
51             break
52         except FileNotFoundError as e:
53             print("there is no such file!")
54             conn.send(b"no file")
55             continue

client端:

 1 import socket
 2 import os
 3 client = socket.socket()
 4 client.connect(("192.168.168.128",8000))
 5 # client.connect(("localhost",8000))
 6
 7 while True:
 8     try:
 9         msg = input(">>>>>").strip()
10         if len(msg) == 0: continue
11         client.send(msg.encode())
12         if msg.startswith("get"):
13             data = client.recv(1024)
14             if data.decode() == "no file":
15                 print("there is no such file!")
16                 continue
17             else:
18                 print("The file‘s size is %sM" % round(int(data.decode())/1024/1024,2))
19                 msg_list = msg.split(" ")
20                 file_name = msg_list[-1]
21                 f = open(file_name,"wb")
22                 total_size = int(data.decode())
23                 file_size = 0
24                 while True:
25                     data2 = client.recv(1024)
26                     f.write(data2)
27                     file_size += len(data2)
28                     if file_size == total_size:
29                         break
30                 f.close()
31         elif msg.startswith("put"):
32             msg_cmd_list = msg.split(" ")
33             file_name = msg_cmd_list[-1]
34             client.send(str(os.path.getsize(file_name)).encode())
35             f = open(file_name, "rb")
36             f_data = f.readlines()
37             for line in f_data:
38                 client.send(line)
39         else:
40             data = client.recv(1024)
41             print("client receive:", data.decode())
42             total_size = int(data.decode())
43             received_size = 0
44             res = b""
45             while received_size < total_size:
46                 d = client.recv(1024)
47                 res += d
48                 received_size += len(d)
49             print("-----receive done-----")
50             print(res.decode())
51     except FileNotFoundError as e:
52         print("There is no such file!")
53         client.send(b"no file")
54         continue
时间: 2024-11-09 07:09:29

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

《python源码剖析》笔记 Python虚拟机框架

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1. Python虚拟机会从编译得到的PyCodeObject对象中依次读入每一条字节码指令, 并在当前的上下文环境中执行这条字节码指令. Python虚拟机实际上是在模拟操作中执行文件的过程 PyCodeObject对象中包含了字节码指令以及程序的所有静态信息,但没有包含 程序运行时的动态信息--执行环境(PyFrameObject) 2.Python源码中的PyFrameObject

《python源码剖析》笔记 python虚拟机中的一般表达式

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.字节码指令 LOAD_CONST:从consts表中读取序号为i的元素并压入到运行时栈中 STORE_NAME:改变local名字空间.从符号表names取序号为i的元素作为变量名, 取运行时栈的栈顶元素作为变量值,完成从变量名到变量值的映射关系的创建. BUILD_MAP:创建一个空的PyDictObject对象,并压入运行时栈 DUP_TOP:将栈顶元素的引用计数增加1,并将它再次

[学习笔记] Python标准库简明教程 [转]

1 操作系统接口 os 模块提供了一系列与系统交互的模块: >>> os.getcwd() # Return the current working directory '/home/minix/Documents/Note/Programming/python/lib1' >>> os.chdir('~/python') # Change current working directory Traceback (most recent call last): File

[学习笔记] Python标准库的学习准备 [转]

Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准库所涉及的应用很广,所以需要学习一定的背景知识. 硬件原理 这一部份需要了解内存,CPU,磁盘存储以及IO的功能和性能,了解计算机工作的流程,了解指令的概念.这些内容基础而重要. Python标准库的一部份是为了提高系统的性能(比如mmap),所以有必要了解基本的计算机各个组成部分的性能. 操作系统 在了解操作系统时,下面是重点: 1) 操作系统的进程管理,比如什么是UID, PID, daemon 2) 进程之间

《python源码剖析》笔记 python虚拟机中的函数机制

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.Python虚拟机在执行函数调用时会动态地创建新的 PyFrameObject对象, 这些PyFrameObject对象之间会形成PyFrameObject对象链,模拟x86平台上运行时栈 2.PyFuctionObject对象 typedef struct { PyObject_HEAD PyObject *func_code: //对应函数编译后的PyCodeObject对象 Py

[terry笔记]GoldenGate_迁移同步_主库零停机

ogg根据scn同步数据,源库零停机时间 本次实验与上次的区别:更加注重细节,几乎包含所有步骤,把我越到的坑都作出了说明.并且同步是由10g向11g进行同步,更加符合升级迁移需求. 如下是主要步骤: 1. 配置好ogg源端的mgr.抓取和传送进程,并启动. 2. 配置好ogg目标端的mgr.复制进程,仅启动mgr. 3. 源端可自由进行交易,此时观察源与目标的trail文件是否都正常. 4. 查询源端此时的scn,并按照参数flashbask_scn进行expdp. 5. 目标端impdp导入.

《python源码剖析》笔记 python中的List对象

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.PyListObject对象 --> 变长可变对象,可看作vector<PyObject *> typedef struct{ PyObject_VAR_HEAD //其中的ob_size表示实际被使用的内存的数量 PyObject **ob_item;//ob_item为指向元素列表的指针,实际上,Python中的list[0]就是ob_item[0] int allocat

《python源码剖析》笔记 python中的Dict对象

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.PyDictObject对象 -->  C++ STL中的map是基于RB-tree的,搜索时间复杂度是O(logN) PyDictObject采用了hash表,时间复杂度是O(1) typedef struct{ Py_ssize_t me_hash; //me_key的hash值,避免每次查询都要重新计算一遍hash值 PyObject *me_key; PyObject *me_

《python源码剖析》笔记 Python的编译结果

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.python的执行过程 1)对python源代码进行编译,产生字节码 2)将编译结果交给python虚拟机,由虚拟机按照顺序一条一条地执行字节码,产生执行结果 图7-1 2.Python编译器的编译结果--PyCodeObject对象 Python编译器的编译结果中包含了字符串.常量值.字节码等在源代码中出现的一切有用的静态信息. 在Python运行期间,这些静态信息被PyCodeOb