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.可以做关系测试, ...
随机推荐
- 【Beta】设计与计划
目录 新增功能描述 小程序:按模块说明需求 用户权限模块 新闻模块 活动模块 社团模块 社团管理模块 小程序:按页面说明需求变化 新闻页 活动页/活动列表页 活动详情页 社团页 某类别社团页 社团详情 ...
- Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件
Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件 交换文件 查看内存:free -m , -m是显示单位为MB,-g单位GB 创建一个文件:touch /root/swapfi ...
- Spring Boot使用Html
1.引入模板thymeleaf <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- 在 RPA10.X 运行异常,RPA9 却正常的问题处理
一.现象 RPA10.X 在一些极少数 win7/win10 环境中一运行就崩溃或无运行结果. 二.原因 出现上述现象已经确定是OPenGL 驱动兼容性造成的. 三.解决方法 方法一 只要把流程的管理 ...
- UltraISO安装windows10时0x8007000D错误解决办法
进入安装界面之后提示错误:windows无法打开所需的文件 F:\Sources\install.wim.请确保安装所需的所有文件可用,并重新启动安装.错误代码:0x8007000D 原因: 肯定是i ...
- docker build提示error checking context:can't stat xxx
现象描述 使用docker build一个镜像的时候,提示下面的错误: ➜ docker build -t image_name -f xxx.dockerfile . error checking ...
- 理解 uptime 的:“平均负载”? 如何模拟测试
每次发现系统变慢时,我们通常做的第一件事,就是执行 top 或者 uptime 命令,来了解系统的负载情况.比如像下面这样,我在命令行里输入了 uptime 命令,系统也随即给出了结果. [root@ ...
- numtodsinterval 函数用法
numtodsinterval(<x>,<c>) ,x是一个数字,c是一个字符串,表明x的单位,这个函数把x转为interval day to second数据类型 常用的单位 ...
- 一次升级jar包遇到的空指针异常
今天自己在升级公司的一个jar后,一直报空指针异常.代码如下 package com.zhuanche.http; import com.alibaba.fastjson.JSON; import c ...
- STL源码之traits编程技法
摘要 主要讨论如何获取迭代器相应型别.使用迭代器时,很可能用到其型别,若需要声明某个迭代器所指对象的型别的变量,该如何解决.方法如下: function template的参数推导机制 例如: tem ...