python使用selector模块编写FTP
server
import os
import socket
import time
import selectors
BASE_DIR = os.path.dirname(os.path.abspath(__file__)) class selectFtpServer(object): def __init__(self):
self.dic = {}
self.hasReceived = 0
self.sel = selectors.DefaultSelector()
self.create_socket()
self.handler() def create_socket(self):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("127.0.0.1", 8885))
server.listen(5)
self.sel.register(server, selectors.EVENT_READ, self.accept)
print("服务端已开启,等待用户连接...") def handler(self):
while True:
events = self.sel.select()
for key, mask in events:
call_back = key.data
call_back(key.fileobj, mask) def accept(self, server, mask):
conn, addr = server.accept()
print("from %s %s connected" % addr)
self.sel.register(conn, selectors.EVENT_READ, self.read) self.dic[conn] = {} def read(self, conn, mask):
try:
if not self.dic[conn]:
data = conn.recv(1024)
cmd, filename, filesize = str(
data, encoding='utf-8').split('|')
self.dic = {
conn: {
"cmd": cmd,
"filename": filename,
"filesize": int(filesize)}}
print(self.dic)
if cmd == 'put':
conn.send(bytes("OK", encoding='utf8')) if self.dic[conn]['cmd'] == 'get':
file = os.path.join(BASE_DIR, "download", filename) if os.path.exists(file):
fileSize = os.path.getsize(file)
send_info = '%s|%s' % ('YES', fileSize)
conn.send(bytes(send_info, encoding='utf8'))
else:
send_info = '%s|%s' % ('NO', 0)
conn.send(bytes(send_info, encoding='utf8'))
else:
if self.dic[conn].get('cmd', None):
print(self.dic[conn].get('cmd'))
cmd = self.dic[conn].get('cmd')
print(cmd)
if hasattr(self, cmd):
func = getattr(self, cmd)
func(conn)
else:
print("error cmd!")
conn.close()
else:
print("error cmd!")
conn.close() except Exception as e:
print('error', e)
self.sel.unregister(conn)
conn.close() def put(self, conn):
self.hasReceived = 0
fileName = self.dic[conn]['filename']
fileSize = self.dic[conn]['filesize']
path = os.path.join(BASE_DIR, "upload", fileName)
while self.hasReceived < fileSize:
recv_data = conn.recv(1024)
self.hasReceived += len(recv_data) with open(path, 'wb') as f:
f.write(recv_data)
if fileSize == self.hasReceived:
if conn in self.dic.keys():
self.dic[conn] = {}
print("%s上传完毕!" % fileName) def get(self, conn): filename = self.dic[conn]['filename']
path = os.path.join(BASE_DIR, "download", filename)
if str(conn.recv(1024), 'utf-8') == "second_active":
with open(path, 'rb') as f:
for line in f:
conn.send(line)
self.dic[conn] = {}
print('文件下载完毕!') if __name__ == '__main__':
ftp = selectFtpServer()
client
import socket
import time
import os BASE_DIR = os.path.dirname(os.path.abspath(__file__)) class selectFtpClient(): def __init__(self):
self.createSocket()
self.command_out() def createSocket(self):
try:
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client.connect(("127.0.0.1", 8885))
print('连接FTP服务器成功!')
except Exception as e:
print("error: ", e) def command_out(self):
while True:
cmd = input('>>>').strip()
if cmd == 'exit':
break
cmd, file = cmd.split()
if hasattr(self, cmd):
func = getattr(self, cmd)
func(cmd, file)
else:
print('调用错误!') def get(self, cmd, file):
pass def put(self, cmd, file):
if os.path.isfile(file):
fileName = os.path.basename(file)
fileSize = os.path.getsize(file)
fileInfo = '%s|%s|%s' % (cmd, fileName, fileSize)
self.client.send(bytes(fileInfo, encoding='utf8'))
recvStatus = self.client.recv(1024)
print('recvStatus', recvStatus)
hasSend = 0
if str(recvStatus, encoding='utf8') == "OK":
with open(file, 'rb') as f:
while fileSize > hasSend:
contant = f.read(1024)
recv_size = len(contant)
self.client.send(contant)
hasSend += recv_size
s = str(int(hasSend / fileSize * 100)) + "%"
print("正在上传文件:" + fileName + " 已经上传:" + s)
print('%s文件上传完毕' % (fileName,))
else:
print('文件不存在') if __name__ == '__main__':
c = selectFtpClient()
python使用selector模块编写FTP的更多相关文章
- 使用Python的requests模块编写请求脚本
requests模块可用来编写请求脚本. 比如,使用requests的post函数可以模拟post请求: resp = requests.post(url, data = content) url即为 ...
- python使用ftplib模块实现FTP文件的上传下载
python已经默认安装了ftplib模块,用其中的FTP类可以实现FTP文件的上传下载 FTP文件上传下载 # coding:utf8 from ftplib import FTP def uplo ...
- python之模块ftplib(FTP协议的客户端)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(FTP协议的客户端) #需求:快速进行ftp上传 ,下载,查询文件 from ...
- 【循序渐进学Python】10.模块和包
1.导入模块 任何Python程序都可以作为模块导入,只要Python解释器能找到我们定义的模块所在位置即可,一般来讲,在一个模块被导入时,Python解释器会按照下面的步骤进行搜索: 在当前所在目录 ...
- python之mysqldb模块安装
之所以会写下这篇日志,是因为安装的过程有点虐心.目前这篇文章是针对windows操作系统上的mysqldb的安装.安装python的mysqldb模块,首先当然是找一些官方的网站去下载:https:/ ...
- python的库有多少个?python有多少个模块?
这里列举了大概500个左右的库: ! Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主 ...
- Python中Selenium模块的使用
目录 Selenium的介绍.配置和调用 Selenium的配置 Selenium的调用 Selenium的使用 定位 定位元素的使用 定位下拉标签元素 在iframe框架之间切换 上传文件 Webd ...
- linux下python调用c模块
在C调用Python模块时需要初始化Python解释器,导入模块等,但Python调用C模块却比较简单,下面还是以helloWorld.c 和 main.py 做一说明: (1)编写C代码,hel ...
- python基础——使用模块
python基础——使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env ...
随机推荐
- 2018.06.27Firing(最大权闭合子图)
Firing Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 11558 Accepted: 3494 Description ...
- 解决css3不支持同时缩放和旋转的办法
设置两个div,外层scale,内层rotate.
- ACM-ICPC 2018 徐州赛区网络预赛 J Maze Designer(最大生成树,倍增lca)
https://nanti.jisuanke.com/t/31462 要求在一个矩形中任意选两个点都有唯一的通路,所以不会建多余的墙. 要求满足上述情况下,建墙的费用最小.理解题意后容易想到首先假设全 ...
- adb 相关命令 以及无法adb识别设备的解决方法
[自己解决方法] 在-/.android/文件夹下面新建adb_usb.ini文件.里面写入设备的idVendor号(0x加上四位数字),然后输入 adb kill-server, 然后adb dev ...
- CodeForces 916B Jamie and Binary Sequence (changed after round) (贪心)
题意:给定两个数字n,m,让你把数字 n 拆成一个长度为 m 的序列a1,a2,a3...am,并且∑2^ai = n,如果有多组,要求序列中最大的数最小,然后再相同就要求除了最大数字典序最大. 析: ...
- 1111 Online Map (30 分)
1111. Online Map (30)Input our current position and a destination, an online map can recommend sever ...
- C++指针一
指针也是变量,占有内存空间,用来保存内存地址. 指针也是一种数据类型,指针是一种数据类型,是指它所致内存空间的数据类型. 指针变量和它指向的内存块是两个不同的概念 *p操作内存 在指针声明时,*号表示 ...
- Android内容提供者(Content provider)
使用ContentProvider共享数据 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访 ...
- 二分图匹配-HK算法
先把代码贴上,其他南京回来再补了.. #include <cstdio> #include <cstdlib> #include <cstring> #includ ...
- 异步多线程 Thread ThreadPool Task
一.线程 Thread ThreadPool 线程是Windows任务调度的最小单位,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以 ...