Python Socket实现文件上传(TCP协议)

时间:2023-02-18 09:01:06

在TCP协议下通过socket模块实现文件上传

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# desc: tcp_server_file_upload import socket
import struct
import json
import time IP_PORT = ('127.0.0.1', 8080)
BUFFERSIZE = 1024 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #获取socket对象,并设置通过TCP协议通信
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#设置连接重用
tcp_server_socket.bind(IP_PORT) #绑定IP地址和端口
tcp_server_socket.listen() #监听,可指定数量 conn, addr = tcp_server_socket.accept() #建立连接
print('client ip addr:', addr)
head_struct = conn.recv(4) #接收定制报头的长度
head_json_len = struct.unpack('i', head_struct)[0] #解包,获取定制报头的长度
head_json = conn.recv(head_json_len).decode('utf-8') #根据上一步解包获得的报头长度,接收报头
head = json.loads(head_json) #将json字符串类型的报头转化为python对象
file_size = head['file_size']#获取待接收文件的大小
file_name = head['file_name']#获取接收文件的名字
print(time.strftime('%Y-%m-%d %H:%M:%S'),' 开始接收文件...') #打印开始接收文件的时间
with open(file_name, 'wb') as f: #以二进制写方式打开文件
'''
循环写入接收的文件内容
'''
while True:
if file_size >= BUFFERSIZE: #如果接收的文件内容大于设置的BUFFERSIZE,就只接收BUFFERSIZE大小的内容
content = conn.recv(BUFFERSIZE) #接收客服端发送的BUFFERSIZE大小的内容
f.write(content) #在服务端写入BUFFERSIZE大小的内容
file_size -= BUFFERSIZE #将待写入的文件大小减去已接收的BUFFERSIZE大小
'''
主要是用于服务端和客户端在同一PC上,且写入比读取快,从而导致服务端先行关闭,
造成客户端连接中断,文件传送不完整
'''
time.sleep(0.00001)
else:
content = conn.recv(file_size) #接收文件剩余部分
f.write(content)
break
print(time.strftime('%Y-%m-%d %H:%M:%S'),' 成功接收文件...') #打印文件接收完成时间 conn.close() #关闭连接
tcp_server_socket.close() #关闭服务端socket

tcp_server_file_upload

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @desc: tcp_client_file_upload import socket
import struct
import json
import os
import time IP_PORT = ('127.0.0.1', 8080)
BUFFERSIZE = 1024 tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #获取socket对象
tcp_client_socket.connect(IP_PORT) #连接服务端 '''
定制化报头
'''
head = {'file_path':r'文件路径',
'file_name':r'文件名',
'file_size':0
} file_path = os.path.join(head['file_path'], head['file_name']) #获取要上传文件的完整路径
file_size = os.path.getsize(file_path) #获取文件大小
head['file_size'] = file_size #将获取到的真实文件大小设置到报头 head_json = json.dumps(head) #将报头python对象转化为json字符串
head_bytes = bytes(head_json, encoding='utf-8') #将报头json字符串转化为bytes字节码
head_struct = struct.pack('i', len(head_bytes)) #将报头bytes字节码以'integer'类型打包为4个字节
tcp_client_socket.send(head_struct) #发送打包为4个字节的报头
tcp_client_socket.send(head_bytes) #发送定制化报头
print(time.strftime('%Y-%m-%d %H:%M:%S'),' 开始发送文件...') #打印开始发送文件的时间
with open(file_path, 'rb') as f: #以二进制读的方式打开文件
'''
循环读取文件内容并发送给服务端
'''
while True:
if file_size >= BUFFERSIZE: #如果发送文件的大小大于BUFFERSIZE,只读取BUFFERSIZE大小的内容
content = f.read(BUFFERSIZE) #读取BUFFERSIZE大小的内容
tcp_client_socket.sendall(content) #发送读取的文件内容
file_size -= BUFFERSIZE #文件大小减去已发送文件的大小
else:
content = f.read(file_size) #读取剩余文件内容
tcp_client_socket.sendall(content) #发送文件读取的文件内容
break #终止循环 print(time.strftime('%Y-%m-%d %H:%M:%S'),' 文件发送成功...') #大于文件发送完成的时间
tcp_client_socket.close() #关闭socket

tcp_client_file_upload

Python Socket实现文件上传(TCP协议)的更多相关文章

  1. python Django之文件上传

    python Django之文件上传 使用Django框架进行文件上传共分为俩种方式 一.方式一 通过form表单进行文件上传 #=================================== ...

  2. Python 基于Python实现Ftp文件上传,下载

    基于Python实现Ftp文件上传,下载   by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...

  3. [Python] socket实现TFTP上传和下载

    一.说明 本文主要基于socket实现TFTP文件上传与下载. 测试环境:Win10/Python3.5/tftpd64. tftpd下载:根据自己的环境选择下载,地址 :http://tftpd32 ...

  4. Python学习---网络文件上传

    中心思想: 传递过去文件的大小,根据文件的大小判断是否文件上传完成: 传递/接受文件采用分流的形式,每次传递/接受部分数据:  文件的读取均采用绝对路径实现,而且是bytes的形式读写 客户端: # ...

  5. selenium+python自动化77-autoit文件上传

    前言 关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三界之外了,不属于selenium的管辖范围(selenium不是万能的,只能操作web上元素).autoit工 ...

  6. selenium+python自动化77-autoit文件上传【转载】

    前言 关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三界之外了,不属于selenium的管辖范围(selenium不是万能的,只能操作web上元素).autoit工 ...

  7. socket实现文件上传(客户端向服务器端上传照片示例)

    本示例在对socket有了基本了解之后,可以实现基本的文件上传.首先先介绍一下目录结构,server_data文件夹是用来存放客户端上传的文件,client_data是模拟客户端文件夹(目的是为了测试 ...

  8. 任意文件上传——tcp

    package chaoba; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; ...

  9. python模拟浏览器文件上传,csrf放行

    服务器端视图函数 from django.shortcuts import render,HttpResponse from django.views.decorators.csrf import c ...

随机推荐

  1. 扫描二维码跳转app

    1.判断是否安装了app <html> <head> <meta name="viewport" content="width=device ...

  2. jQuery对象和javascript对象互换

    jquery变js var obj=$("dom"); 或 var obj=jQuery("dom"); js 变 jquery var $jobj=$(obj ...

  3. 使用AFNetworking进行图片上传

    转载自:http://blog.csdn.net/a645258072/article/details/51728806 项目中,我们经常会用到上传图片的功能,而目前的上传图片分为两种(我只知道两种, ...

  4. DIV&plus;CSS 网页布局之:两列布局

    1.宽度自适应两列布局 两列布局可以使用浮动来完成,左列设置左浮动,右列设置右浮动,这样就省的再设置外边距了. 当元素使用了浮动之后,会对周围的元素造成影响,那么就需要清除浮动,通常使用两种方法.可以 ...

  5. 59 pages的Delphi源码

    http://www.codesc.net/source/list_10_59.shtml

  6. 支付宝打造公共账号业务网关, RSA密钥对生成

    作者: 玉龙      版权全部,同意转载. 请注明出处(创建金融_玉龙  http://www.weibo.com/u/1872245125) 原文地址: http://blog.csdn.net/ ...

  7. 函数模板的trick

    函数模板的trick 让gcc支持成员函数模板的trick 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议   gcc ...

  8. c&plus;&plus;中小项堆声明和使用【转】

    c++默认是大顶堆,小顶堆有两种声明方法: 1.对于基本类型直接用 priority_queue<int, vector<int>, greater<int> >p ...

  9. Windows XP 的最高版本 &period;net framework 安装

    注意: Windows XP 系统已于2014年4月8日停止维护.出于安全.性能及新设备支持考虑,应立即停止使用. 安装 Windows XP SP3 所支持的最高.net framework 版本为 ...

  10. 自定义微信小程序导航(兼容各种手机)

    详细代码请见github,请点击地址,其中有原生小程序的实现,也有wepy版本的实现 了解小程序默认导航 如上图所示,微信导航分为两部分,第一个部分为statusBarHeight,刘海屏手机(iPh ...