Python记11(网络传输大文件

2023-10-31

客户端

import socket, tqdm, os

# 传输数据分隔符
separator = "<separator>"

# 服务器信息
host = "192.168.1.103"
port = 5002   # 1~1024多数会被系统占用,不建议用

#文件传输的缓冲区(传输不是一个字节一个字节传,而是一整个buffer)
buffer_size = 1024

# 传输文件
filename = r"C:\Users\ZHUIAO\Desktop\test.xml"

# 文件大小
file_size = os.path.getsize(filename)

# 创建socket连接
s = socket.socket()

# 连接服务器
print(f"服务器连接中{host}:{port}")
s.connect((host, port))
print("与服务器连接成功!")

# 发送文件名字和文件大小,必须进行编码处理encode()
s.send(f"{filename}{separator}{file_size}".encode())

# 文件传输,用tqdm提示发送进度,传输单位Byte(1024表示1Byte=1024bit)
progress = tqdm.tqdm(range(file_size), f"发送{filename}", unit="B", unit_divisor=1024)

with open(filename, "rb") as f:
    for _ in progress:
        # 读取文件
        bytes_read = f.read(buffer_size)    # 一次读取buffer_size大小的
        if not bytes_read:      # 读取不到就退出
            break
        # sendall()可以确保即使网络拥堵,数据仍然可以传输
        s.sendall(bytes_read)
        progress.update(len(bytes_read))    # 按照读的大小 更新进度条

# 关闭资源
s.close()

服务器

import socket, tqdm, os

# 传输数据分隔符
separator = "<separator>"

# 服务器信息
server_host = "192.168.1.103"
server_port = 5002   # 1~1024多数会被系统占用,不建议用

# 文件传输的缓冲区(传输不是一个字节一个字节传,而是一整个buffer)
buffer_size = 4096

# 创建的Server
s = socket.socket()
s.bind((server_host, server_port))  # 服务器绑定端口

# 设置连接监听数
s.listen(5)
print(f"服务器端监听{server_host}:{server_port}")

# 接受客户端连接
client_socket, address = s.accept()     # 哪一个客户的socket, ip地址
print(f"客户端{address}连接。")# 打印客户端ip

# 接收客户端信息
received = client_socket.recv(buffer_size).decode()     # 解码
filename, file_size = received.split(separator)         # 客户端用separator分割的
filename = os.path.basename(filename)                   # 获取文件的名字,去除路径
file_size = int(file_size)      # 传输过来的是字符串类型

# 文件接收处理
progress = tqdm.tqdm(range(file_size), f"接收{filename}", unit="B", unit_divisor=1024, unit_scale=True)

with open(filename, "wb") as f:     # 写入
    for _ in progress:
        # 从客户端读取数据
        bytes_read = client_socket.recv(buffer_size)
        if not bytes_read:      # 读取结束
            break

        f.write(bytes_read)
        progress.update(len(bytes_read))

# 关闭资源,先关闭客户端,再关闭服务器
client_socket.close()
s.close()









本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python记11(网络传输大文件 的相关文章

随机推荐

  • [Java]学习笔记

    一些JAVA的学习笔记 记录 主要是和C的不同点 https www runoob com java java tutorial html 声明数组变量 注意 建议使用 dataType arrayRefVar 的声明风格声明数组变量 da
  • 【多同步挤压变换】基于多同步挤压变换处理时变信号和噪声信号研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 算例1 2 2 算例2 2 3 算例3 2 4 算例4 2 5 算例5 3 参考文献
  • c++版本itk读取dicom序列

    读取dicom序列 hablee void readDicomSeries const std string dicom dir itk Image
  • .NET MVC+EF CodeFirst+IOC+EasyUI 框架设计教程(概述)

    一 开发环境 Win7 VS2013 C SQL Server2008 R2 二 总体源代码结构如下 说明 这个分层按个人理解 不一定要照我的 如果做过开发 会三层架构之类的理解起来就容易 01 Infrastructure 基础构件 Ne
  • QGIS批量将分幅遥感影像合并

    要在QGIS中编程实现批量将分幅遥感影像拼接成完整影像 可以按照以下步骤进行操作 1 首先 确保已经安装并正确配置了QGIS Python环境 并导入所需的库 以下是代码的导入部分 from qgis core import QgsProj
  • 常见的金融术语——176个基础金融知识名词解释

    基金类 1 开放式基金 open end funds 指基金规模不是固定不变的 而是可以随时根据市场供求情况发行新份额或被投资人赎回的投资基金 2 封闭式基金 close end funds 指基金规模在发行前已确定 在发行完毕后及规定的期
  • 解决文字自动换行,字母、数字不换行问题

    添加css属性word break break all
  • mysql修改root密码的语句

    ALTER USER root localhost IDENTIFIED WITH mysql native password BY 新密码 其中 localhost 字符 有的小伙伴可能遇到过无法通过navicat连接Linux中的MyS
  • 单点登录SSO:可一键运行的完整代码

    单点登录方案不同于一个普通站点 它的部署比较繁琐 涉及到好几个站点 要改host 安装证书 配置HTTPS 看到的不少这方面示例都是基于HTTP的 不认同这种简化 1 它体现不出混合HTTP HTTPS时 单点注销要注意处理的问题 2 做单
  • 【Node.js】下载安装及简单使用

    说起Node js 它是当前市面上非常受欢迎的框架 允许我们使用JavaScript搭建后端应用 它有着种种优点 诸如 非阻塞I O 事件驱动 跨平台 高性能 单线程 等等等等 不过现在我们不必执拗与关心这些优点的含义 当务之急是先上手他
  • conda加速设置

    Conda作为使用最为便捷的python环境管理工具 可以协助我们很方便的下载安装第三方库 软件包等操作 但其在下载资源的过程中速度不言而喻 尤其是在更换国内源的情况下 下载速度没有实质性的改变是很令人头疼的一件事 Mamba 树眼镜蛇 能
  • (tensorflow学习)用Object Detection API实现摄像头实时物体检测

    对于物体识别 谷歌已经有训练好的模型供我们使用 图方便不想自己训练的可以直接使用 说实话 装这个tensorflow真心麻烦 我建议用anaconda环境搭建 还要注意装的话装1 几的版本就可 用gpu跑的话注意显卡型号和版本是否兼容 真是
  • 【C++】内存管理

    目录 一 C C 内存分布 二 C语言中动态内存管理方式 三 C 中动态内存管理 1 开辟空间 2 释放空间 四 operator new与operator delete函数 五 内存泄漏 1 什么是内存泄漏 2 如何避免内存泄漏 总结 一
  • Python的getattr方法

    getattr是Python中的内置函数 用于获取一个对象的属性值 这个函数是动态获取属性的一种方式 特别适用于你事先不知道要获取哪个属性 或者属性名是在运行时确定的情况 使用方法 getattr object name default o
  • 资产安全 错题点

    数据所有者 1 决定谁有权访问信息系统 2 对资产负有最终责任 PS 对资产负有最终责任的 高级管理层 数据所有者 首选管理层 3 行为规则 制定规则 以便用于主体的数据或信息的适当使用及保护 4 决定数据的级别 每年回顾确保数据分级的正确
  • 【国产化踩坑记】openEuler系统安装,nvidia驱动,cuda,anaconda安装步骤记录

    1 openEuler安装步骤 尝试安装了openEuler20 03和22 03两个版本 在摸索的过程中总结了一下步骤 以及相关问题的解决方案 进行简单记录 便于后续使用 1 openEuler20 03安装步骤 网络配置以及可视化操作界
  • Segmentation fault (core dumped) 错误的一种解决场景

    错误类型 Segmentation fault core dumped 产生原因 Segmentation fault 段错误 Core Dump 核心转储 是操作系统在进程收到某些信号而终止运行时 将此时进程地址空间的内容以及有关进程状态
  • Springboot+Axios双token解决token过期续签问题

    后端分离使用token进行登录验证时 由于token存在过期时间 每次token过期都需要用户重新登录的话 用户体验很不友好 假如token能跟session一样 如果用户持续在进行操作 就自动延长有效时间 就可以解决问题 但是 token
  • qt利用腾讯云服务器实现不同局域网的通信(tcp)

    网上大多数关于qt通信的文章都是同一局域网通信 这种根本没有达到自己想象中的那种通信的要求 不同局域网的通信 这里用到的方法是客户端发送消息给服务器 然后服务器再发送给另一个局域网的客户 首先我们需要购买一个腾讯云服务器 并在自己电脑登录腾
  • Python记11(网络传输大文件

    客户端 import socket tqdm os 传输数据分隔符 separator