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. org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403

    爬取网站的时候 conn = Jsoup.connect(url).timeout(5000).get();直接用get方法,有些网站可以正常爬取. 但是有些网站报403错误,403是一种在网站访问的 ...

  2. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  3. C++STL stack

    stack栈 先进后出 stack<int> s ; s.push();//元素入栈 //出栈 while(!s.empty()){ int tmp = s.top(); s.pop(); ...

  4. arguments[0]()的详解

    var length = 10; function fn(){ console.log(this.length); } var obj = { length:5, method:function(fn ...

  5. 【慕课网实战】Spark Streaming实时流处理项目实战笔记八之铭文升级版

    铭文一级: Spark Streaming is an extension of the core Spark API that enables scalable, high-throughput, ...

  6. Android自定义视图一:扩展现有的视图,添加新的XML属性

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  7. CentOS 6 安装Redmine

    Redmine是一个灵活的项目管理web应用,采用Ruby on Rails框架开发.Redmine是典型的web 2.0网站,项目管理系统的后起之秀.Redmine支持多项目,灵活的角色权限管理,灵 ...

  8. web-day16

    第16章WEB16-Listener&Filter篇 今日任务 使用过滤器完成自动登录的案例 使用过滤器统一网站的字符集编码 教学导航 教学目标 了解常见的监听器 理解过滤器的生命周期 能够使 ...

  9. index.jsp首页访问不了的解决方法

    解决方法: Tomcat,将项目添加到里面 部署解包的webapp目录 将Web项目部署到Tomcat中的方法之一,是部署没有封装到WAR文件中的Web项目.要使用这一方法部署未打包的webapp目录 ...

  10. redis解决保存快照失败后redis无法写入的问题

    通过关闭配置项stop-writes-on-bgsave-error解决该问题. redis 127.0.0.1:6379> config set stop-writes-on-bgsave-e ...