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多路复用机制的上传下载相关推荐

  1. python 网盘上传_python学习笔记 day32 实现网盘上传下载功能

    1. 作业需求 借助socket模块实现server端和client端的交互,拟实现网盘上传下载的功能: 上传: client端发送请求,把本地的文件上传给server端,server端负责接收,然后 ...

  2. python批量上传执行脚本_python 写的批量操作远程主机脚本(命令执行,上传、下载文件)...

    本帖最后由 Matthew0701 于 2011-4-28 21:45 编辑 最近在学习python,借助fabric模块写了个批量操作服务器的脚本,在此分享给大家,如有不足之处,欢迎大家指正 准备工 ...

  3. IO 操作 (二进制流文件上传下载)

    后台 二进制流 -> 前台blob对象 ->生成 dateUrl->前台 file->dataUrl -blob ->FormData ->后台 java 后台返回 ...

  4. 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现

    文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...

  5. python程序发布到阿里云云服务器_Python实现阿里云服务器里的文件上传与下载

    Python实现阿里云服务器里的文件上传与下载 018.4.15 背景: 老实说,因为现实的各种原因造成电脑换来换去是可能出现的事情,但是电脑能换,电脑里的环境却不能换.我就曾在三个电脑里各自安装了虚 ...

  6. java IO流进阶 模拟上传头像系统详解

    目录 一.前言: 二.思路: PS:直接看代码中的注释也可以. ①分析: ②总结: 三.代码: ①准备工作: ②代码演示: ③运行效果: 四.撒❀: 一.前言: 这篇文章是对之前java IO流基础 ...

  7. python io多路复用_【python】-- IO多路复用(select、poll、epoll)介绍及实现

    IO多路复用(select.poll.epoll)介绍及select.epoll的实现 IO多路复用中包括 select.pool.epoll,这些都属于同步,还不属于异步 一.IO多路复用介绍 1. ...

  8. 基于Springboot外卖系统13:实现文件上传下载模块

    1. 上传功能模块 1.1 上传概述 文件上传,也称为upload,是指将本地图片.视频.音频等文件上传到服务器上,可以供其他用户浏览或下载的过程. 文件上传时,对页面的form表单有如下要求: 表单 ...

  9. php上传 io err,【Dz上传附件】解决Discuz Server(IO)Error问题

    [Dz上传附件]解决Discuz Server(IO)Error问题 2018-12-17 Discuz 上传文件时会碰到Discuz Server(IO)Error错误了,这个小编排查了许久没找到问 ...

最新文章

  1. DIV周边添加投影及背景固定
  2. 精简三星Galaxy III 迷你版 自带无用软件
  3. Go知识点:slice、map、func、struct、method、interface、channel、goroutine
  4. c语言dll注入器,Module Injector-Module Injector(DLL动态库注入器)下载 v1.0--pc6下载站
  5. 用flask部署模型
  6. Python安装dlib包
  7. python:浅析python 中__name__ = '__main__' 的作用
  8. python classmethod函数_在python中使用与instance和classmethod相同的函数
  9. 4.maven中常用的构建命令
  10. 吴恩达机器学习(十二)主成分分析(降维、PCA)
  11. 简单的制作一个动态链接库(DLL)
  12. 黑客攻防技术宝典web实战篇:利用信息泄露习题
  13. Node.js的异步I/O
  14. 计算机制图作品答辩,工程制图(第一章)答辩.ppt
  15. 关于华为2019全联接大会,精华内容都在这里!
  16. Pr:视频防抖效果控件
  17. 使用python做王者荣耀挂机刷金币脚本
  18. C++编程FFMpeg实时美颜直播推流实战-基于ffmpeg,qt5,opencv视频课程-夏曹俊-专题视频课程...
  19. win10家庭版桌面软件图标左下角箭头删除
  20. 从《生活计划》实践,剖析自我执行力

热门文章

  1. 同一个tomcat部署多个项目导致启动失败
  2. java判断字符串是否为乱码
  3. 去除Android 6.0 界面下的导航栏:NavigationBar
  4. NHibernate直接执行SQL进行插入
  5. 数据库某些要注意的问题(转的,侵权删除)
  6. Redis的RDB AOF DATABASE
  7. C++读写文件总结 .
  8. StarCraft的工程师谈美国的游戏开发过程
  9. 以色列网络武器出口对象国从102个锐减至37个
  10. 我如何判断漏洞奖励计划是否值得参加?如何获得最大收益?