selector多路复用_python selectors模块实现 IO多路复用机制的上传下载
import selectors
import socket
import os,time
base_dir = os.path.dirname(os.path.abspath(__file__))
class server:
# sel = selectors.defaultselector()
def __init__(self):
self.ip_port=('127.0.0.1',8080)
self.sel=selectors.defaultselector()#根据平台选择最佳的io多路机制,比如linux就会选择epoll
self.dic = {}
self.create_sock()
self.handle()
def create_sock(self):
sock = socket.socket()
sock.bind(('localhost', 1234))
sock.listen(100)
# sock.setblocking(false)#注册监听对象,绑定accept
self.sel.register(sock, selectors.event_read, self.accept
def handle(self):
while true:#sel监听sock变化,当sock实例化时,赋值给events,通过回调函数触发#key.data(key.fileobj,mask) accept(sock,mask),#当有客户端连接时通过accept注册到read……events = self.sel.select() # [sock,conn1,conn2]
for key, mask in events:
callback = key.data # sel accept sel read
callback(key.fileobj, mask) #accept(sock,mask),read(conn1,mask)……def accept(self,sock, mask):
print('登录服务端---')
conn, addr = sock.accept() # should be ready
print('accepted', conn, 'from', addr)
# conn.setblocking(false)
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)
try:
cmd, filename, filesize = str(data.decode("utf-8")).split("|")
self.dic[conn] = {"cmd": cmd, "filename": filename, "filesize": filesize, "hasreceived": 0}
except exception as e:
cmd, filename = str(data.decode("utf-8")).split("|")
self.dic[conn] = {"cmd": cmd, "filename": filename,"filesize": os.path.getsize(os.path.join(base_dir, "load", filename)),"hassended": 0}
if cmd=='put':#上传
conn.send('ok'.encode('utf8'))
if cmd=='get':#下载
conn.send(str(self.dic[conn]['filesize']).encode('utf8'))
else:
if self.dic[conn].get('cmd',none):
cmd =self.dic[conn].get('cmd')
if hasattr(self,cmd):
func=getattr(self,cmd)
func(conn,mask)#反射命令分发
else:
print('error')
except exception as e:
print(e,conn,'断开连接')
conn.close()
self.sel.unregister(conn)
def put(self,conn,mask):
filename=self.dic[conn]['filename']
filesize = self.dic[conn]['filesize']
path = os.path.join(base_dir, "upload", filename)
data = conn.recv(1024)
conn.send("success".encode("utf-8"))
self.dic[conn]['hasreceived'] += len(data)
with open(path, "ab") as f:
f.write(data)
if self.dic[conn]['hasreceived'] == self.dic[conn]['filesize']:
self.dic[conn] = {}
print("上传结束")
#少写一步
def get(self, conn, mask):
filename = self.dic[conn]['filename']
path = os.path.join(base_dir, "load", filename)
with open(path, "rb") as f:
f.seek(self.dic[conn]["hassended"], 0)
data = f.read(1024)
conn.send(data)
self.dic[conn]['hassended'] += len(data)
if self.dic[conn]['hassended'] == self.dic[conn]["filesize"]:
self.dic[conn] = {}
print("下载结束")
time.sleep(0.5)
if __name__ == "__main__":
server()
import os, time, sys
base_dir = os.path.dirname(os.path.abspath(__file__))
import socket
import selectors
class selectftpclient:
def __init__(self):
self.port = ("127.0.0.1", 8001)
self.create_socket()
self.command_fanout()
def create_socket(self):
try:
self.sock = socket.socket()
self.sock.connect(self.port)
print("连接ftp成功!")
except exception:
print("连接失败!")
def command_fanout(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 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.sock.send(bytes(fileinfo, encoding="utf-8"))
recvstatus = self.sock.recv(1024)
hassend = 0
if str(recvstatus, encoding="utf-8") == 'ok':
with open(file, "rb") as f:
while filesize > hassend:
contant = f.read(10)
recv_size = len(contant)
self.sock.send(contant)
hassend += recv_size
s = str(int(hassend / filesize * 100)) + "%"
print("正在上传文件:" + filename + " 已经上传: " + s)
time.sleep(0.5)
print("%s文件上传完毕" % (filename,))
else:
print("文件不存在")
# 下载
def get(self, cmd, file):
fileinfo = "%s|%s" % (cmd, file)
self.sock.send(bytes(fileinfo, encoding="utf-8"))
filesize = int(self.sock.recv(10).decode("utf-8"))
f = open(file, "ab")
i = 0
while i < filesize:
self.sock.send("ok".encode("utf-8"))
data = self.sock.recv(10)
f.write(data)
i += len(data)
s = str(int(i / filesize * 100)) + "%"
print("正在上传文件:" + file + " 已经下载: " + s)
print("下载完成")
f.close()
if __name__ == "__main__":
selectftpclient()
希望与广大网友互动??
点此进行留言吧!
selector多路复用_python selectors模块实现 IO多路复用机制的上传下载相关推荐
- python 网盘上传_python学习笔记 day32 实现网盘上传下载功能
1. 作业需求 借助socket模块实现server端和client端的交互,拟实现网盘上传下载的功能: 上传: client端发送请求,把本地的文件上传给server端,server端负责接收,然后 ...
- python批量上传执行脚本_python 写的批量操作远程主机脚本(命令执行,上传、下载文件)...
本帖最后由 Matthew0701 于 2011-4-28 21:45 编辑 最近在学习python,借助fabric模块写了个批量操作服务器的脚本,在此分享给大家,如有不足之处,欢迎大家指正 准备工 ...
- IO 操作 (二进制流文件上传下载)
后台 二进制流 -> 前台blob对象 ->生成 dateUrl->前台 file->dataUrl -blob ->FormData ->后台 java 后台返回 ...
- 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现
文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...
- python程序发布到阿里云云服务器_Python实现阿里云服务器里的文件上传与下载
Python实现阿里云服务器里的文件上传与下载 018.4.15 背景: 老实说,因为现实的各种原因造成电脑换来换去是可能出现的事情,但是电脑能换,电脑里的环境却不能换.我就曾在三个电脑里各自安装了虚 ...
- java IO流进阶 模拟上传头像系统详解
目录 一.前言: 二.思路: PS:直接看代码中的注释也可以. ①分析: ②总结: 三.代码: ①准备工作: ②代码演示: ③运行效果: 四.撒❀: 一.前言: 这篇文章是对之前java IO流基础 ...
- python io多路复用_【python】-- IO多路复用(select、poll、epoll)介绍及实现
IO多路复用(select.poll.epoll)介绍及select.epoll的实现 IO多路复用中包括 select.pool.epoll,这些都属于同步,还不属于异步 一.IO多路复用介绍 1. ...
- 基于Springboot外卖系统13:实现文件上传下载模块
1. 上传功能模块 1.1 上传概述 文件上传,也称为upload,是指将本地图片.视频.音频等文件上传到服务器上,可以供其他用户浏览或下载的过程. 文件上传时,对页面的form表单有如下要求: 表单 ...
- php上传 io err,【Dz上传附件】解决Discuz Server(IO)Error问题
[Dz上传附件]解决Discuz Server(IO)Error问题 2018-12-17 Discuz 上传文件时会碰到Discuz Server(IO)Error错误了,这个小编排查了许久没找到问 ...
最新文章
- DIV周边添加投影及背景固定
- 精简三星Galaxy III 迷你版 自带无用软件
- Go知识点:slice、map、func、struct、method、interface、channel、goroutine
- c语言dll注入器,Module Injector-Module Injector(DLL动态库注入器)下载 v1.0--pc6下载站
- 用flask部署模型
- Python安装dlib包
- python:浅析python 中__name__ = '__main__' 的作用
- python classmethod函数_在python中使用与instance和classmethod相同的函数
- 4.maven中常用的构建命令
- 吴恩达机器学习(十二)主成分分析(降维、PCA)
- 简单的制作一个动态链接库(DLL)
- 黑客攻防技术宝典web实战篇:利用信息泄露习题
- Node.js的异步I/O
- 计算机制图作品答辩,工程制图(第一章)答辩.ppt
- 关于华为2019全联接大会,精华内容都在这里!
- Pr:视频防抖效果控件
- 使用python做王者荣耀挂机刷金币脚本
- C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程-夏曹俊-专题视频课程...
- win10家庭版桌面软件图标左下角箭头删除
- 从《生活计划》实践,剖析自我执行力