python学习之利用socketserver的文件传输
使用socketserver进行多用户的文件传输
服务端
class FtpServer(socketserver.BaseRequestHandler): # 继承socketserver.BaseRequestHandler
def handle(self): #handle必须有,是派生方法是重定义继承的handle,是用于处理交互
pass
客服端
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT)) # 建立连接
开启服务
server = socketserver.ThreadingTCPServer((HOST, PORT), FtpServer) # 创建socketserver对象
server.serve_forever() # 开启服务(一直开启)
handle
def handle(self):
"""处理与用户的命令"""
while self:
"""用于解决黏包问题"""
header_size = struct.unpack('i', self.request.recv(4))[0] # 接收自定义包头
header_bytes = self.request.recv(header_size)
header = json.loads(header_bytes.decode('utf-8'))
action_type = header.get('type')
""""用反射调用方法"""
if hasattr(self, '_' + action_type):
getattr(self, '_' + action_type)(header)
else:
print('invalid command')
服务端自定义的发送包头
def _send(self, status_code, **kwargs):
msg = kwargs
msg['status_code'] = status_code
msg['status_msg'] = self.STATUS_CODE[status_code]
bytes_data = json.dumps(msg).encode('utf-8')
self.request.send(struct.pack('i', len(bytes_data)))
self.request.send(bytes_data)
服务端转到客服端
def _get(self, header):
filename = header.get('filename')
if os.path.isfile(file_path):
file_size = os.stat(filename ).st_size
self._send(size=file_size) # 先发送包头
print("ready to send file ")
f = open(file_path, 'rb')
for line in f:
self.request.send(line)
else:
print('file send done..', filename )
f.close()
else:
self_send(size=0)
客户端接收
def get(filename):
_send(type='get', filename=filename) # 发送自定义头
header = _recv() # 接收自定义头
size = header.get('size')
if size:
f = open(filename, 'wb')
while size: # 接收数据
if size >= 1024:
data = sock.recv(1024)
f.write(data)
f.flush()
size -= len(data) # len(data)为接收到的数据长度,如果写1024的话可能会出现数据接收不完整的问题
else:
data = sock.recv(size)
f.write(data)
f.flush()
size -= len(data) # 同理
if size == 0:
break
f.close()
客服端包头的发送和接收
def _send(**kwargs):
"""发送"""
msg = kwargs
header_bytes = json.dumps(msg).encode('utf-8')
sock.send(struct.pack('i', len(header_bytes)))
sock.send(header_bytes) def _recv():
"""接收"""
header_size = struct.unpack('i', sock.recv(4))[0]
header_bytes = sock.recv(header_size)
header = json.loads(header_bytes.decode('utf-8'))
return header
python学习之利用socketserver的文件传输的更多相关文章
- python学习笔记(六)文件夹遍历,异常处理
python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...
- Python学习系列(五)(文件操作及其字典)
Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件 在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...
- 洗礼灵魂,修炼python(86)--全栈项目实战篇(12)—— 利用socket实现文件传输/并发式聊天
由于本篇博文的项目都很简单,所以本次开个特例,本次解析两个项目,但是都很简单的 项目一:用socket实现文件传输 本项目很简单,作为小项目的预热的,前面刚学完socket,这里马上又利用socket ...
- Python实现多种SSH连接与文件传输
Python实现SSH控制 使用Python进行基于口令认证的连接: 1 #加载paramiko包 2 import paramiko 3 #创建新的SSH对象 4 Client=paramiko.S ...
- 我们一起学习WCF 第六篇文件传输
原文 http://www.cnblogs.com/LipeiNet/p/4653830.html 前言:文件的输出我们并不陌生,但是今天我写的是用wcf模式进行文件传输,我觉得一大好处就是能进 ...
- 吴裕雄--天生自然python学习笔记:Python3 File(文件) 方法
open() 方法 Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError. 注意:使用 open() ...
- python学习笔记——(三)文件操作
·集合操作及其相应的操作符表示集合中没有插入,只有添加,因为毕竟无序 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Vergil Zhan ...
- 老男孩 python学习自修第二十二天【文件上传与下载】
1.使用socket实现文件上传 server.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import os import SocketServe ...
- python学习笔记(二)文件操作和集合
集合: 集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据 集合的作用: 1.它可以把一个列表中重复的数据去掉,而不需要你再写判断 2.可以做关系测试, ...
随机推荐
- Re3 : Real-Time Recurrent Regression Networks for Visual Tracking of Generic Objects
Re3 : Real-Time Recurrent Regression Networks for Visual Tracking of Generic Objects 2019-10-04 14:4 ...
- 虚拟机 /dev/mapper/centos-root 动态扩容
[root@bogon ~]# df -h Filesystem Size Used Avail Use% Mounted on .2G .2G 51M % / devtmpfs 908M 908M ...
- vue---将json导出Excel的方法
在做数据表格渲染的时候,经常遇到的需求的就是将导出excel,下面是使用vue进行项目数据进行导出的方法. 一.安装依赖 npm i -S file-saver npm i -S xlsx 二.在sr ...
- cisco 路由与ASA SSH 设置
转载于https://www.cnblogs.com/sun292393989/p/8980700.html 一 试验拓扑 二 Server配置 ①配置hostname和domain name 因为r ...
- MySQL数据类型:UNSIGNED注意事项(转)
原文地址:https://www.cnblogs.com/blankqdb/archive/2012/11/03/blank_qdb.html 1. UNSIGNED UNSIGNED属性就是将数字类 ...
- python初级(302) 6 对象(五)
一.复习 1.什么是多态 2.什么是继承 二.继承:向父母学习 在面向对象编程中,类可以从其他类继承属性和方法.这样就有了类的整个家族,这个家族中的每个类共享相同的属性和方法.这样一来,每次向家族增加 ...
- Linux下安装.NET Core
环境 { "操作系统":"CentOS 7.5 64位", "CPU":"1核", "内存":&qu ...
- VSCode调试data层时自身的一个bug
使用VSCode在pytorch下进行调试有的时候会遇到下面这个错误: E00037.: Exception escaped from start_client Traceback (most rec ...
- python 科学计算基础库安装
1.numpyNumPy(Numeric Python)是用Python进行科学计算的基本软件包. NumPy是Python编程语言的扩展,增加了对大型多维数组和矩阵的支持,以及一个大型的高级数学函数 ...
- Xamarin.Android UnauthorizedAccessException: Access to the path is denied
进行文件读写,勾选了权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" / ...