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.可以做关系测试, ...
随机推荐
- jQuery实现列表框双向选择操作
对列表框的操作经常碰到过这样的应用:从左侧的列表框中选中要选的项添加到右侧列表框中,然后提交最终选择的项,对误操作而选中的项还可以执行移除操作.在很多系统中应用比如说求职网站的选择意向工作地区,QQ好 ...
- EventHandler
表示将处理不包含事件数据的事件的方法 作用:这句话的意思就是把这两个事放在一起了,意思就是叫你吃完饭了喊我一声.我委托你吃完饭了,喊我一声.这样我就不用过一会就来看一下你吃完了没有了,已经委托你了.
- Google BERT应用之《红楼梦》对话人物提取
Google BERT应用之<红楼梦>对话人物提取 https://www.jiqizhixin.com/articles/2019-01-24-19
- Guava集合工具
JDK提供了一系列集合类,如下所示,极大的方便了开发工作,并针对这些类提供了一个工具类java.util.Collections,Guava在此基础上添加了一些常用工具类方法,相比于java.util ...
- web3 编译部署调用合约
//导入solc 编译器 let solc = require('solc') let fs = require('fs') //读取合约 let sourceCode = fs.readFileSy ...
- 添加QDialog的Layout布局属性操作
转载:https://blog.csdn.net/u013015629/article/details/73874773 QDialog在创建完之后,在设计器QtDesigner中的布局默认是锁定的. ...
- mysql判断表字段或索引是否存在,然后修改
判断字段是否存在: DROP PROCEDURE IF EXISTS schema_change; DELIMITER // CREATE PROCEDURE schema_change() BEGI ...
- jetty demo实例启动
Jetty是一个提供HHTP服务器.HTTP客户端和javax.servlet容器的开源项目.Jetty和tomcat相比,是轻量级服务器,支持热拔插,可扩展性大tomcat集成了很多功能,个性化瘦身 ...
- springboot vue前后端分离 跨跨域配置
public class CustomCorsFilter extends OncePerRequestFilter { @Override protected void doFilterIntern ...
- scrapy爬虫案例:用MongoDB保存数据
用Pymongo保存数据 爬取豆瓣电影top250movie.douban.com/top250的电影数据,并保存在MongoDB中. items.py class DoubanspiderItem( ...