selectors 模块完成文件上传下载功能

 1 ############    server端
 2
 3 import selectors,socket,time,pickle,os,struct
 4 ip_port = (‘192.168.43.182‘,8080)
 5 buffer_size = 1024
 6 back_log = 5
 7 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 8
 9 class SelectorsServer:
10     def __init__(self):
11         self.conn_dict = {}
12         self.has_put = 0
13         self.has_get = 0
14         self.sel = selectors.DefaultSelector()      ##  创建selectors 对象
15         self.creat_socket()
16         self.handle()       ##  监听
17
18     def creat_socket(self):     ##  创建socket 对象
19         sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
20         sock.bind(ip_port)
21         sock.listen(back_log)
22         sock.setblocking(False)
23         self.sel.register(sock,selectors.EVENT_READ,self.accept)
24
25     def handle(self):      ##  监听事件
26          while 1:           ##  循环监听
27             events = self.sel.select()
28             for key,mask in events:
29                 callback = key.data
30                 callback(key.fileobj,mask)
31
32
33     def accept(self,sock,mask):     ###     连接
34         conn,addr = sock.accept()
35         # print(conn)
36         print(‘连接成功。。。‘)
37         conn.setblocking(False)
38         self.sel.register(conn,selectors.EVENT_READ,self.read)     ##  给conn注册
39         self.conn_dict[conn] = {}   ##  标识conn连接完成
40
41     def read(self,conn,mask):     ##  通信循环
42         if not self.conn_dict[conn]:    ##  第一次进来
43             res = conn.recv(buffer_size)
44             res = pickle.loads(res)
45             action = res[‘action‘]
46             filename = res[‘filename‘]
47             filename = os.path.join(BASE_DIR,‘files‘,filename)
48             print(‘ok‘)
49             conn.sendall(b‘ready‘)        ##  取到动作和文件名
50             self.conn_dict[conn] = {‘action‘:action,‘filename‘:filename}
51             if hasattr(self, action):
52                 func = getattr(self,action)
53                 func(conn)
54         else:       ##  不是第一次进来
55             if self.conn_dict[conn][‘action‘] == ‘put‘:     ##  上传
56                 self.put_append(conn)       ##  追加
57
58     def put_append(self,conn):
59         f = open(self.conn_dict[conn][‘filename‘],‘ab‘)
60         if self.has_put < self.conn_dict[conn][‘file_size‘]:
61             data = conn.recv(buffer_size)       ##  接收正文
62             f.write(data)
63             self.has_put += len(data)
64         f.close()
65
66     def put(self,conn):      ##  上传
67         print(‘能运行到put‘,conn)
68
69         file_size = conn.recv(4)
70         file_size = struct.unpack(‘i‘,file_size)
71         self.conn_dict[conn][‘file_size‘] = file_size
72         f = open(self.conn_dict[conn][‘filename‘],‘wb‘)
73         if self.has_put < file_size:
74             data = conn.recv(buffer_size)       ##  接收正文
75             f.write(data)
76             self.has_put += len(data)
77         f.close()
78
79
80     def get(self):      ##  下载
81         pass
82
83
84
85
86
87 if __name__ == ‘__main__‘:
88     SelectorsServer()
 1 ############        client端
 2 import socket,os,pickle,struct
 3 ip_port = (‘192.168.43.182‘,8080)
 4 buffer_size = 1024
 5 BASE_DIR = os.path.dirname(os.path.abspath(__file__))
 6 print(BASE_DIR)
 7 class SelectorsClient:
 8     def __init__(self):
 9         self.creat_socket()
10         self.handle()
11
12     def handle(self):
13         while 1:
14             cmd_res = input(‘>>>:‘)
15             action,filename = cmd_res.split()
16             send_dict = {
17                 ‘action‘:action,
18                 ‘filename‘:filename
19             }
20             self.client.sendall(pickle.dumps(send_dict))        ##  传一个字典
21             recv_data = self.client.recv(buffer_size)
22             print(recv_data)
23             if hasattr(self,action):
24                 func = getattr(self,action)
25                 func(filename)
26
27
28     ##  put 123.png
29     def put(self,filename):         ##  上传操作
30         with open(filename,‘rb‘) as f:
31             data = f.read()
32         length = len(data)
33         file_size = struct.pack(‘i‘,length)
34         self.client.sendall(file_size)     ##  发送文件大小
35         self.client.sendall(data)       ##  发送正文
36
37
38
39     ##  get 123.png
40     def get(self):          ##  下载操作
41         pass
42
43     def creat_socket(self):
44         self.client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
45         self.client.connect(ip_port)
46
47 if __name__ == ‘__main__‘:
48     SelectorsClient()

原文地址:https://www.cnblogs.com/maoxinjueluo/p/12695135.html

时间: 2024-10-15 20:14:10

selectors 模块完成文件上传下载功能的相关文章

JavaWeb实现文件上传下载功能实例解析

转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件

JavaWeb实现文件上传下载功能实例解析 (好用)

转: 转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上

基于Java的一个简单的文件上传下载功能

最近在公司给客户端做接口,有一个图片上传和文件下载的功能,本来想用Struts来做文件上传下载,但是看了下公司好像没有这个配置,然后看了下同事的代码,才发现原来Apache也可以简单的实现文件上传下载. 首先引入commons-io-2.2.jar FileUtils为我们提供了很多对文件的操作的方法,比如上传整个文件夹的文件.上传单个文件等 然后请看代码下载: public static void uploadFile(String targetDirectory,String targetF

利用Django REST framework快速实现文件上传下载功能

安装包 pip install Pillow 设置 首先在settings.py中定义MEDIA_ROOT与MEDIA_URL.例如: MEDIA_ROOT = os.path.join(BASE_DIR, "files") MEDIA_URL = "/files/" files可以是项目根目录的任何一个文件夹 在urls.py的urlpatterns中,设置访问文件的url from django.views.generic import TemplateView

Asp.net实现MVC处理文件的上传下载功能实例教程

这篇文章主要介绍了Asp.net实现MVC处理文件的上传下载功能,比较全面而系统的对Asp.net MVC的文件上传下载功能进行了深入分析,有很好的借鉴价值,需要的朋友可以参考下 上传于下载功能是程序设计中非常常见的一个功能,在ASP.NET程序开发中有着非常广泛的应用.本文就以实例形式来实现这一功能. 一.概述 如果你仅仅只有Asp.net Web Forms背景转而学习Asp.net MVC的,我想你的第一个经历或许是那些曾经让你的编程变得愉悦无比的服务端控件都驾鹤西去了.FileUploa

salesforce 零基础学习(四十二)简单文件上传下载

项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文件上传到Document对象中. 一.文件上传功能 apex代码 1 public with sharing class FileUploadUsedTransientController { 2 3 public transient Blob fileUploadBody{get;set;} 4

文件上传下载样式 --- bootstrap

在平时工作中,文件上传下载功能属于不可或缺的一部分.bootstrap前端样式框架也使用的比较多,现在根据bootstrap强大的样式模板,自定义一种文件下载的样式. 后续会使用spring MVC框架实现文件上传的全部代码,敬请期待. 先看图片示例: 本示例包括下载样本文件样式和上传文件样式. 直接先上代码,最后讲解: <div class="form-group col-md-12 has-feedback" id="file"> <label

JavaWeb 文件上传下载

1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下载功能实现的. 文件上传下载实际上是两步操作,第一是文件上传,就是将本地文件上传到服务器端,实现文件多用户之间的共享,第二是文件下载,就是将服务器端的文件下载到本地磁盘. 1.2. 文件上传下载实现原理 首先,需要知道文件是如何实现上传及下载的.文件上传及下载实现原理如下: 文件上传实现流程如下:

张明贵-Linux文件上传下载及sCRT配置批量管理功能

[讲课:互动,用提问的方式来吸引听众的注意力,听众吸收最大化] 大学是在许昌学院读的,在我看来,不干念PPT的老师就是好讲师,因为大部分任课老师自顾自讲,没有互动,传授的知识我们只是被动的听,没有引导听课者的思考,再此吐槽一下,哈哈!我还是真心希望我的母校越来越好. 文件的上传下载 rz 上传 rz命令不存在 [[email protected] ~]# rz -bash: rz: command not found 安装 lrzsz(需要联网或配置yum源) yum install lrzsz