python利用socket实现udp文件传输功能
作者:_在水一方 发布时间:2023-07-07 14:15:33
标签:python,udp,文件传输
本文实例为大家分享了UDP实现文件传输的具体代码,供大家参考,具体内容如下
tcp进行文件传输看这里–python实现TCP文件接发
这里实现的接收方一直接收,发送方每次发送一个文件,方便我在其他函数中调用发送文件。
使用udp 容易出现丢包现象需要处理
要注意 tcp 和udp的套接字不一样
# udp:
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# tcp
tcp_socketr = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
1、发送
# import socket
# import tqdm
# import os
# import threading
#
# # 由客户端向服务器传数据,文件
import threading
import socket
import tqdm
import os
import cv2
from time import ctime, sleep
def send(address, filename):
# 传输数据间隔符
SEPARATOR = '<SEPARATOR>'
# 服务器信息
host, port = address
# 文件缓冲区
Buffersize = 4096*10
# 传输文件名字
filename = filename
# 文件大小)
file_size = os.path.getsize(filename)
# 创建socket链接
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
print(f'服务器连接中{host}:{port}')
s.connect((host, port))
print('与服务器连接成功')
# 发送文件名字和文件大小,必须进行编码处理
# s.sendto(f'{filename}{SEPARATOR}{file_size}'.encode(), ("127.0.0.1", 1234))
s.send(f'{filename}{SEPARATOR}{file_size}'.encode('utf-8'))
# 文件传输
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(Buffersize)
# print(bytes_read)
if not bytes_read:
print('exit退出传输,传输完毕!')
s.sendall('file_download_exit'.encode('utf-8'))
break
# sendall 确保络忙碌的时候,数据仍然可以传输
s.sendall(bytes_read)
progress.update(len(bytes_read))
sleep(0.001)
# 关闭资源
s.close()
if __name__ == '__main__':
address = ('127.0.0.1', 1234)
# host = '127.0.0.1'
# port = 1234
filename = input('请输入文件名:')
t = threading.Thread(target=send, args=(address, filename))
t.start()
# received(address, filename)
2、接收
import socket
import tqdm
import os
import threading
# 使用UDP传输视频,全双工,但只需一方接,一方收即可
# 设置服务器的ip和 port
# 服务器信息
# sever_host = '127.0.0.1'
# sever_port =1234
def recvived(address, port):
# 传输数据间隔符
SEPARATOR = '<SEPARATOR>'
# 文件缓冲区
Buffersize = 4096*10
while True:
print('准备接收新的文件...')
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_socket.bind((address, port))
recv_data = udp_socket.recvfrom(Buffersize)
recv_file_info = recv_data[0].decode('utf-8') # 存储接收到的数据,文件名
print(f'接收到的文件信息{recv_file_info}')
c_address = recv_data[1] # 存储客户的地址信息
# 打印客户端ip
print(f'客户端{c_address}连接')
# recv_data = udp_socket.recv()
# 接收客户端信息
# received = udp_socket.recvfrom(Buffersize).decode()
filename ,file_size = recv_file_info.split(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('8_18_'+filename,'wb') as f:
for _ in progress:
# 从客户端读取数据
bytes_read = udp_socket.recv(Buffersize)
# 如果没有数据传输内容
# print(bytes_read)
if bytes_read == b'file_download_exit':
print('完成传输!')
print(bytes_read)
break
# 读取写入
f.write(bytes_read)
# 更新进度条
progress.update(len(bytes_read))
udp_socket.close()
if __name__ == '__main__':
# address = ("127.0.0.1", 1234)
port = 1234
address = "127.0.0.1"
t = threading.Thread(target=recvived, args=(address, port))
t.start()
# send(address)
来源:https://blog.csdn.net/JSSQSC/article/details/120041114


猜你喜欢
- 忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串。相信不少同学会有同感。几乎任何一种编程语言,都把字符串列为最
- 问题有一个元素序列,想知道在序列中出现次数最多的元素是什么解决方案collections 模块中的 Counter 类转让给女士为此问题所设
- 作者:做梦的人(小姐姐)出处:https://www.cnblogs.com/chongyou/因为最近在做平台,发现有同事,使用djang
- 1.0 新建项目1.1 初始化项目输入npm init,之后需要填什么就写什么新建src目录,并在src目录下新建alert.vue$ np
- SQL Server中加密是层级的,每一个上层为下提供保护。如图:实例:/** SMK(Service Master Key)在SQL Se
- date() 获取日期,格式:2004-2-28 time() 获取时间,格式:22:24:59 now() 获取日期和时间 格式: 200
- 在最开始的时候所有的斐波那契代码都是使用递归的方式来写的,递归有很多的缺点,执行效率低下,浪费资源,还有可能会造成栈溢出,而递归的程序的优点
- 项目中涉及到一些加密解密的需求,了解并尝试了几种加密解密方法,以下:方法一:md5加密注意:md5的特性就是只能加密,所以用md5加密的时候
- python字符串过滤性能比较5种方法比较总共比较5种方法。直接看代码:import randomimport timeimport osi
- 今天无意当中看到参数slave_exec_mode,从手册里的说明看出该参数和MySQL复制相关,是可以动态修改的变量,默认是STRICT模
- Microsoft office Access Database Engine 错误 '80040e14' Insert I
- inspect模块用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等,有几个好用的方法:D
- 本文主讲Python中Numpy数组的类型、全0全1数组的生成、随机数组、数组操作、矩阵的简单运算、矩阵的数学运算。尽管可以用python中
- ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写 的,主要用于创建前端用户界面,是一个与后台技术无关的
- 一般情况下,访问或设置剪贴板,IE 只需使用 window.clipboardData 的 getData 或 setData 方法即可。M
- 跨域当我们遇到请求后台接口遇到 Access-Control-Allow-Origin 时,那说明跨域了。跨域是因为浏览器的同源策略所导致,
- 1、创建数组 var array = new Array(); var array = new Array(size);//指定数组的长度
- 对win32 COM不是很熟悉,不知道一个程序究竟有多少属性或者方法可以操作。仅仅是一个Sheet页的添加就费了我好长时间,因为这种成功来自
- 目录技术背景diagrams的安装基础逻辑关系图组件簇的定义总结概要技术背景对于一个架构师或者任何一个软件工程师而言,绘制架构图都是一个比较
- 一看,C盘只有不到2M可用空间,一查原因,sqlserver安装路径下的log目录文件占了好大,5G多, 于是上网搜了下,解决了: 把与sq