使用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的文件传输的更多相关文章

  1. python学习笔记(六)文件夹遍历,异常处理

    python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...

  2. Python学习系列(五)(文件操作及其字典)

    Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件      在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...

  3. 洗礼灵魂,修炼python(86)--全栈项目实战篇(12)—— 利用socket实现文件传输/并发式聊天

    由于本篇博文的项目都很简单,所以本次开个特例,本次解析两个项目,但是都很简单的 项目一:用socket实现文件传输 本项目很简单,作为小项目的预热的,前面刚学完socket,这里马上又利用socket ...

  4. Python实现多种SSH连接与文件传输

    Python实现SSH控制 使用Python进行基于口令认证的连接: 1 #加载paramiko包 2 import paramiko 3 #创建新的SSH对象 4 Client=paramiko.S ...

  5. 我们一起学习WCF 第六篇文件传输

    原文  http://www.cnblogs.com/LipeiNet/p/4653830.html   前言:文件的输出我们并不陌生,但是今天我写的是用wcf模式进行文件传输,我觉得一大好处就是能进 ...

  6. 吴裕雄--天生自然python学习笔记:Python3 File(文件) 方法

    open() 方法 Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError. 注意:使用 open() ...

  7. python学习笔记——(三)文件操作

    ·集合操作及其相应的操作符表示集合中没有插入,只有添加,因为毕竟无序 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Vergil Zhan ...

  8. 老男孩 python学习自修第二十二天【文件上传与下载】

    1.使用socket实现文件上传 server.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import os import SocketServe ...

  9. python学习笔记(二)文件操作和集合

    集合: 集合也是一种数据类型,一个类似列表东西,它的特点是无序的,不重复的,也就是说集合中是没有重复的数据 集合的作用: 1.它可以把一个列表中重复的数据去掉,而不需要你再写判断 2.可以做关系测试, ...

随机推荐

  1. 服务器负载过高问题分析-不是cpu高负载也不是IO负载如何处理(阿里 几乎是必考题)

    关于top命令 经常问load average 参考:load average 定义(网易面试) jvm dump的使用 参考:Jvm dump jstack jmap jstat 介绍与使用(内存与 ...

  2. HttpClient 连接泄漏问题

    AbstractConnPool.java 提交记录 https://github.com/apache/httpcomponents-core/commits/4.4.x/httpcore/src/ ...

  3. 自己动手实现DNS协议

    1. 主要内容 不说废话,直接进入正题.先说说本文本文的主要内容,好让你决定是否看下去: 介绍DNS是干什么的: 介绍DNS是如何工作的: 介绍DNS请求与响应的消息格式: 编程实现一个简单的DNS服 ...

  4. tensorflow 预训练模型列表

    tensorflow 预训练模型列表 https://github.com/tensorflow/models/tree/master/research/slim Pre-trained Models ...

  5. 基于springboot+jquery+H5的文件(并发+断点+分片)的上传方案

    1.支持文件分片断点续传 2.支持已上传文件再次上传时秒传 3.多个人对同一个文件同时上传可以多线程并发协调上传,加快超大文件的上传速度. 技术点:springboot + webflux + red ...

  6. WebDataBinder 学习顺序

    01. 关于Spring属性处理器PropertyResolver以及应用运行环境Environment的深度分析,强大的StringValueResolver使用和解析[享学Spring] http ...

  7. 【转载】 TensorFlow函数:tf.Session()和tf.Session().as_default()的区别

    原文地址: https://blog.csdn.net/Enchanted_ZhouH/article/details/77571939 ------------------------------- ...

  8. apache httpd 从2.2升级到2.4的过程及中间遇到的坑

    背景描述: 最近集团在做安全扫描,扫出了http的漏洞,一看是监控nagios涉及到的httpd,于是就考虑将httpd升级到最新的版本,在升级的过程中,真是遇到了很多的坑,弄了2天终于搞定了,现在梳 ...

  9. 生命游戏(python实现,pygame显示图形)

    # 游戏规则:# 生命游戏(Game of Life),或者叫它的全称John Conway's Game of Life.是英国数学家约翰·康威在1970年代所发明的一种元胞自动机.# 1. 活细胞 ...

  10. aps.net StateServer设置

    1.在 system.web节点 加 <sessionState mode="StateServer" stateConnectionString="tcpip=1 ...