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的更多相关文章

  1. 使用Python的requests模块编写请求脚本

    requests模块可用来编写请求脚本. 比如,使用requests的post函数可以模拟post请求: resp = requests.post(url, data = content) url即为 ...

  2. python使用ftplib模块实现FTP文件的上传下载

    python已经默认安装了ftplib模块,用其中的FTP类可以实现FTP文件的上传下载 FTP文件上传下载 # coding:utf8 from ftplib import FTP def uplo ...

  3. python之模块ftplib(FTP协议的客户端)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(FTP协议的客户端) #需求:快速进行ftp上传 ,下载,查询文件 from ...

  4. 【循序渐进学Python】10.模块和包

    1.导入模块 任何Python程序都可以作为模块导入,只要Python解释器能找到我们定义的模块所在位置即可,一般来讲,在一个模块被导入时,Python解释器会按照下面的步骤进行搜索: 在当前所在目录 ...

  5. python之mysqldb模块安装

    之所以会写下这篇日志,是因为安装的过程有点虐心.目前这篇文章是针对windows操作系统上的mysqldb的安装.安装python的mysqldb模块,首先当然是找一些官方的网站去下载:https:/ ...

  6. python的库有多少个?python有多少个模块?

    这里列举了大概500个左右的库: !   Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主 ...

  7. Python中Selenium模块的使用

    目录 Selenium的介绍.配置和调用 Selenium的配置 Selenium的调用 Selenium的使用 定位 定位元素的使用 定位下拉标签元素 在iframe框架之间切换 上传文件 Webd ...

  8. linux下python调用c模块

    在C调用Python模块时需要初始化Python解释器,导入模块等,但Python调用C模块却比较简单,下面还是以helloWorld.c 和 main.py 做一说明:   (1)编写C代码,hel ...

  9. python基础——使用模块

    python基础——使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env ...

随机推荐

  1. 2018.10.24 bzoj2064: 分裂(状压dp)

    传送门 状压dp好题. 考虑对于两个给出的集合. 如果没有两个元素和相等的子集,那么只能全部拼起来之后再拆开,一共需要n1+n2−2n1+n2-2n1+n2−2. 如果有呢? 那么对于没有的就是子问题 ...

  2. JAVA折腾微信公众平台(Token验证)[转]

    JAVA折腾微信公众平台(Token验证) BAE的JAVA还在内测的时候,抱着好奇的态度发邮件申请了内测权限,当时折腾了一天,然后就没折腾了.现在BAE的JAVA都已经正式开放使用了,我又蛋疼的想写 ...

  3. poj-1328(贪心+思维)

    题目链接:传送门 思路:找最少有几个点,先求出每个点的覆盖范围,就是一个点最大可以到达的地方是y相同的地方而且直线距离是d, 所以x范围在[x-sqrt(d*d-y*y),x+sqrt(d*d-y*y ...

  4. poj-3067(树状数组)

    题目链接:传送门 题意:日本有东城m个城市,西城m个城市,东城与西城相互连线架桥,判断这些桥相交的次数. 思路:两个直线相交就是(x1-x2)*(y1-y2)<0,所以,对x,y进行排序,按照x ...

  5. ac自动机板子

    hdu2222 #include<bits/stdc++.h> #define ll long long #define M 500005 using namespace std; int ...

  6. excel的小bug

    http://muchong.com/html/201710/3913047.html Excel也有相同现象,试着计算:exp(-1.5^2),exp(0-1.5^2),exp(-(1.5)^2)看 ...

  7. python:浅拷贝与深拷贝

    1,“相等”与“相同” 我们先赋值三个变量a, b, c: a = [1, 2, [1, 2]] b = [1, 2, [1, 2]] c = a 判断一下‘相等’: a == b  返回 True ...

  8. [置顶] AngularJS实战之路由ui-sref-active使用

    当我们使用angularjs的路由时,时常会出现一个需求,当选中菜单时把当前菜单的样式设置为选中状态(多数就是改变颜色) 接下来就看看Angular-UI-Router里的指令ui-sref-acti ...

  9. c#+web下载文件夹

    最近公司在做工程项目,实现文件夹下载. 网上找了很久,发现网上的代码都有相似的问题,不过最终还是让我找到了一个符合的项目. 工程: 进行项目文件夹下载功能分析,弄清楚文件夹下载的原理,提供的数据支持. ...

  10. MIT Molecular Biology 笔记4 DNA相关实验

    视频  https://www.bilibili.com/video/av7973580?from=search&seid=16993146754254492690 教材 Molecular ...