Python socket文件上传下载
python网络编程
程序的目录结构
socketDemo
├── client
│ ├── cli.py
│ └── local_dir
│ └── lianxijiangjie.mp4
└── server
├── download
│ └── lianxijiangjie.mp4
└── ser.py
基础版本
ser.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'mosson'
import socket
import struct
import json
import os base_dir = os.path.dirname(os.path.abspath(__file__))
base_dir = os.path.join(base_dir, 'download') class MYTCPServer:
address_family = socket.AF_INET
socket_type = socket.SOCK_STREAM
allow_reuse_address = False
max_packet_size = 8192
coding='utf-8'
request_queue_size = 5
server_dir='file_upload' def __init__(self, server_address, bind_and_activate=True):
"""Constructor. May be extended, do not override."""
self.server_address=server_address
self.socket = socket.socket(self.address_family,
self.socket_type)
if bind_and_activate:
try:
self.server_bind()
self.server_activate()
except:
self.server_close()
raise def server_bind(self):
"""Called by constructor to bind the socket.
"""
if self.allow_reuse_address:
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind(self.server_address)
self.server_address = self.socket.getsockname() def server_activate(self):
"""Called by constructor to activate the server.
"""
self.socket.listen(self.request_queue_size) def server_close(self):
"""Called to clean-up the server.
"""
self.socket.close() def get_request(self):
"""Get the request and client address from the socket.
"""
return self.socket.accept() def close_request(self, request):
"""Called to clean up an individual request."""
request.close() def run(self):
print('server is running .......')
while True:
self.conn,self.client_addr=self.get_request()
print('from client ',self.client_addr)
while True:
try:
head_struct = self.conn.recv(4)
if not head_struct:break head_len = struct.unpack('i', head_struct)[0]
head_json = self.conn.recv(head_len).decode(self.coding)
head_dic = json.loads(head_json) print(head_dic)
cmd=head_dic['cmd']
if hasattr(self,cmd):
func=getattr(self,cmd)
func(head_dic)
except Exception:
break def put(self,args):
"""
文件长传
:param args:
:return:
"""
file_path=os.path.normpath(os.path.join(
base_dir, args['filename'])) filesize=args['filesize']
recv_size=0
print('----->',file_path)
with open(file_path,'wb') as f:
while recv_size < filesize:
recv_data=self.conn.recv(2048)
f.write(recv_data)
recv_size += len(recv_data)
else:
print('recvsize:%s filesize:%s' %(recv_size,filesize)) def get(self, args):
""" 下载文件
1 检测服务端文件是不是存在
2 文件信息 打包发到客户端
3 发送文件
"""
filename = args['filename']
dic = {}
if os.path.isfile(base_dir + '/' + filename):
dic['filesize'] = os.path.getsize(base_dir + '/' + filename)
dic['isfile'] = True
else:
dic['isfile'] = False
str_dic = json.dumps(dic) # 字典转str
bdic = str_dic.encode(self.coding) # str转bytes
dic_len = len(bdic) # 计算bytes的长度
bytes_len = struct.pack('i', dic_len) #
self.conn.send(bytes_len) # 发送长度
self.conn.send(bdic) # 发送字典
# 文件存在发送真实文件
if dic['isfile']:
with open(base_dir + '/' + filename, 'rb') as f:
while dic['filesize'] > 2048:
content = f.read(2048)
self.conn.send(content)
dic['filesize'] -= len(content)
else:
content = f.read(2048)
self.conn.send(content)
dic['filesize'] -= len(content)
print('下载完成') tcpserver1=MYTCPServer(('127.0.0.1',8083)) tcpserver1.run()
服务端代码
cli.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'mosson' import socket
import struct
import json
import os
import time base_dir = os.path.dirname(os.path.abspath(__file__))
base_dir = os.path.join(base_dir, 'local_dir') class MYTCPClient:
address_family = socket.AF_INET socket_type = socket.SOCK_STREAM allow_reuse_address = False max_packet_size = 8192 coding='utf-8' request_queue_size = 5 def __init__(self, server_address, connect=True):
self.server_address=server_address
self.socket = socket.socket(self.address_family,
self.socket_type)
if connect:
try:
self.client_connect()
except:
self.client_close()
raise def client_connect(self):
self.socket.connect(self.server_address) def client_close(self):
self.socket.close() def run(self):
while True:
inp=input(">>: ").strip()
if not inp:continue
l=inp.split()
cmd=l[0]
if hasattr(self,cmd):
func=getattr(self,cmd)
func(l) def put(self,args):
cmd=args[0]
filename = args[1]
filename = base_dir + '/' + filename
print(filename)
if not os.path.isfile(filename):
print('file:%s is not exists' %filename)
return
else:
filesize=os.path.getsize(filename) head_dic={'cmd':cmd,'filename':os.path.basename(filename),'filesize':filesize}
print(head_dic)
head_json=json.dumps(head_dic)
head_json_bytes=bytes(head_json,encoding=self.coding) head_struct=struct.pack('i',len(head_json_bytes))
self.socket.send(head_struct)
self.socket.send(head_json_bytes)
send_size = 0
t1 = time.time()
# with open(filename,'rb') as f:
# for line in f:
# self.socket.send(line)
# send_size+=len(line)
# else:
# print('upload successful')
# t2 = time.time()
with open(filename, 'rb') as f:
while head_dic['filesize'] > 2048:
content = f.read(2048)
self.socket.send(content)
head_dic['filesize'] -= len(content)
else:
content = f.read(2048)
self.socket.send(content)
head_dic['filesize'] -= len(content)
t2 = time.time() print(t2-t1) def get(self, args):
cmd = args[0]
filename = args[1]
dic = {'cmd': cmd, 'filename': filename}
"""发送dic的步骤
字典转str
str转bytes
计算bytes的长度
发送长度
发送字典
"""
str_dic = json.dumps(dic) # 字典转str
bdic = str_dic.encode(self.coding) # str转bytes
dic_len = len(bdic) # 计算bytes的长度
bytes_len = struct.pack('i', dic_len) #
self.socket.send(bytes_len) # 发送长度
self.socket.send(bdic) # 发送字典 # 接受 准备下载的文件信息
dic_len = self.socket.recv(4)
dic_len = struct.unpack('i', dic_len)[0]
dic = self.socket.recv(dic_len).decode(self.coding)
dic = json.loads(dic)
# 文件存在准备下载
if dic['isfile']:
t1 = time.time()
with open(base_dir+'/'+filename, 'wb') as f:
while dic['filesize'] > 2048:
content = self.socket.recv(2048)
f.write(content)
dic['filesize'] -= len(content)
else:
while dic['filesize']:
content = self.socket.recv(2048)
f.write(content)
dic['filesize'] -= len(content)
t2 = time.time()
print(t2-t1) else:
print('文件不存在!') client=MYTCPClient(('127.0.0.1',8083)) client.run()
客户端代码
升级版本
。。。。。。。。
==================== 码字不易,如有帮助,请多多支持 ====================
Python socket文件上传下载的更多相关文章
- python day32--struct,文件上传下载
一.struct模块 可以把要发送的数据长度转换成固定长度的字节 struct.pack('i',数据长度) struct.unpack('i',数据长度) 二.上传下载文件作业 server imp ...
- python服务器文件上传下载+GUI【tkinter】
大概就是一个通过应用程序来和服务器打交道的这么一个,小东西 1.GUI 用的是tkinter # -*- coding: UTF-8 -*- from tkinter import * import ...
- Python 基于Python实现Ftp文件上传,下载
基于Python实现Ftp文件上传,下载 by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...
- python 实现远端ftp文件上传下载
python 实现ftp上传下载 * 脚本需要传入两个参数,参数1为需要从远端ftp站点下载文件名称,参数2为已知需要下载的文件md5值,文件下载完成后会自动进行md5值校验 * 运行示例 [root ...
- Android连接socket服务器上传下载多个文件
android连接socket服务器上传下载多个文件1.socket服务端SocketServer.java public class SocketServer { ;// 端口号,必须与客户端一致 ...
- Python接口自动化——文件上传/下载接口
〇.前言 文件上传/下载接口与普通接口类似,但是有细微的区别. 如果需要发送文件到服务器,例如:上传文档.图片.视频等,就需要发送二进制数据,上传文件一般使用的都是 Content-Type: mul ...
- 文件上传下载、socketserver(并发)、解读socketserver源码
1.文件上传/下载 学习了socket套接字,我们现在可以写一个文件上传/下载的程序,如下示例: 分析上边代码,我们发现,client发送上传文件相关信息的字典序列化之后,server又给client ...
- python3 + selenium 之文件上传下载
文件上传 文件上传下载的联系html: uplad.html <html> <head> <meta http-equiv="content-type" ...
- Python Selenium 文件上传之Autoit
今天补充一种文件上传的方法 主要是因为工作中使用SendKeys方法不稳定,具体方法见: Python Selenium 文件上传之SendKeys 这种方法直接通过命令行执行脚本时没有问题,可以成功 ...
随机推荐
- javascript学习-创建json对象数据,遍历
之前我已经有讲过后台返回json数据到前台,并在前台遍历json数据. 这里讲下直接在JS里创建JSON数据,然后遍历使用~ 创建代码例如以下:(创建的是JSON对象) var YearSelect ...
- 实战caffe多标签分类——汽车品牌与车辆外观(C++接口)[详细实现+数据集]
前言 很多地方我们都需要用到多标签分类,比如一张图片,上面有只蓝猫,另一张图片上面有一只黄狗,那么我们要识别的时候,就可以采用多标签分类这一思想了.任务一是识别出这个到底是猫还是狗?(类型)任务二是识 ...
- C#将string转换为十六进制
/// <summary> /// 将string格公式为十六进制数据 /// </summary> /// <param ...
- Windows下Apache+MySQL+PHP快速配置的几种方法
Apache MySQL PHP Windows WAMP 1.易思EasySiteServer服务器集成环境 v1.0 (推荐) 尔创互联为推广其ESPCMS而开发的一个小东东,很好用.零配置,完 ...
- js父窗体关闭,子窗体紧随
近来的.我们遇到了权限管理系统.由于权限管理系统与原系统的风格不符.打开一个全新的窗口.问题就来了.admin取消后,,权限管理形式不关闭.其他普通用户登录后.尚能经营权的管理形式. 简化问题:adm ...
- 简明Python3教程 3.介绍
介绍 Python是少有的几种既强大又简单的编程语言.你将惊喜地发现通过使用Python即可轻松专注于解决问题而非和你所用的语言格式与结构. 下面是Python的官方介绍: Python is an ...
- silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发)
原文:silverlight,WPF动画终极攻略之阳光灿烂篇(Blend 4开发) 前面我们画了一只会飞动的小鸟,今天我们在目标是一个会发光的太阳.本章节的动画虽然简单,但是实现的效果可是一点也不打折 ...
- mongodb与SQL对应关系表
1. select查询 mongodb使用find要么findOne要查询: find批量查询. findOne查询记录. find有两个参数: 查询条件. 第二个查询返回的字段. 以下是mongod ...
- PD生成兼容Oracle、Mysql脚本
mysql date 改为 datetime ->运行sql脚本 Oracle " clustered " 替换为空,即key(XX) ->运行sql脚本
- Python+Django+SAE系列教程10-----Django模板
在本章中,我们开始模板,在前面的章节,您可能已经注意到,我们回到文本的方式有点特别的示例视图. 那.HTML直接在硬编码 Python 其中代码. 这的确是一个小BT. def current_dat ...