python利用socket實(shí)現(xiàn)udp文件傳輸功能
本文實(shí)例為大家分享了UDP實(shí)現(xiàn)文件傳輸?shù)木唧w代碼,供大家參考,具體內(nèi)容如下
tcp進(jìn)行文件傳輸看這里–python實(shí)現(xiàn)TCP文件接發(fā)
這里實(shí)現(xiàn)的接收方一直接收,發(fā)送方每次發(fā)送一個文件,方便我在其他函數(shù)中調(diào)用發(fā)送文件。
使用udp 容易出現(xiàn)丟包現(xiàn)象需要處理
要注意 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、發(fā)送
# import socket
# import tqdm
# import os
# import threading
#
# # 由客戶端向服務(wù)器傳數(shù)據(jù),文件
import threading
import socket
import tqdm
import os
import cv2
from time import ctime, sleep
def send(address, filename):
# 傳輸數(shù)據(jù)間隔符
SEPARATOR = '<SEPARATOR>'
# 服務(wù)器信息
host, port = address
# 文件緩沖區(qū)
Buffersize = 4096*10
# 傳輸文件名字
filename = filename
# 文件大小)
file_size = os.path.getsize(filename)
# 創(chuàng)建socket鏈接
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
print(f'服務(wù)器連接中{host}:{port}')
s.connect((host, port))
print('與服務(wù)器連接成功')
# 發(fā)送文件名字和文件大小,必須進(jìn)行編碼處理
# 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'發(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 確保絡(luò)忙碌的時候,數(shù)據(jù)仍然可以傳輸
s.sendall(bytes_read)
progress.update(len(bytes_read))
sleep(0.001)
# 關(guān)閉資源
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傳輸視頻,全雙工,但只需一方接,一方收即可
# 設(shè)置服務(wù)器的ip和 port
# 服務(wù)器信息
# sever_host = '127.0.0.1'
# sever_port =1234
def recvived(address, port):
# 傳輸數(shù)據(jù)間隔符
SEPARATOR = '<SEPARATOR>'
# 文件緩沖區(qū)
Buffersize = 4096*10
while True:
print('準(zhǔn)備接收新的文件...')
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') # 存儲接收到的數(shù)據(jù),文件名
print(f'接收到的文件信息{recv_file_info}')
c_address = recv_data[1] # 存儲客戶的地址信息
# 打印客戶端ip
print(f'客戶端{(lán)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'接收{(diào)filename}', unit='B', unit_divisor=1024, unit_scale=True)
with open('8_18_'+filename,'wb') as f:
for _ in progress:
# 從客戶端讀取數(shù)據(jù)
bytes_read = udp_socket.recv(Buffersize)
# 如果沒有數(shù)據(jù)傳輸內(nèi)容
# print(bytes_read)
if bytes_read == b'file_download_exit':
print('完成傳輸!')
print(bytes_read)
break
# 讀取寫入
f.write(bytes_read)
# 更新進(jìn)度條
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)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
這篇文章主要介紹了如何在 Python 中導(dǎo)入文本文件,在Python中導(dǎo)入文本文件是很常見的操作,我們可以使用內(nèi)置的open函數(shù)和with語句來讀取或?qū)懭胛谋疚募?,需要的朋友可以參考?/div> 2023-05-05
Matplotlib實(shí)戰(zhàn)之堆疊面積圖繪制詳解
堆疊面積圖和面積圖都是用于展示數(shù)據(jù)隨時間變化趨勢的統(tǒng)計圖表,但它們的特點(diǎn)有所不同,堆疊面積圖既能看到各數(shù)據(jù)系列的走勢,又能看到整體的規(guī)模,下面我們就來看看如何繪制堆疊面積圖吧2023-08-08
Python3實(shí)現(xiàn)將本地JSON大數(shù)據(jù)文件寫入MySQL數(shù)據(jù)庫的方法
這篇文章主要介紹了Python3實(shí)現(xiàn)將本地JSON大數(shù)據(jù)文件寫入MySQL數(shù)據(jù)庫的方法,涉及Python針對json大數(shù)據(jù)文件的逐行讀取、mysql數(shù)據(jù)庫寫入等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
將python運(yùn)行結(jié)果保存至本地文件中的示例講解
今天小編就為大家分享一篇將python運(yùn)行結(jié)果保存至本地文件中的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
python偏函數(shù)的實(shí)例用法總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于python偏函數(shù)的實(shí)例用法總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。2021-07-07
Windows下Python的Django框架環(huán)境部署及應(yīng)用編寫入門
這篇文章主要介紹了Windows下Python的Django框架環(huán)境部署及程序編寫入門,Django在Python的框架中算是一個重量級的MVC框架,本文將從程序部署開始講到hellow world web應(yīng)用的編寫,需要的朋友可以參考下2016-03-03最新評論

