本文實(shí)例為大家分享了UDP實(shí)現(xiàn)文件傳輸?shù)木唧w代碼,供大家參考,具體內(nèi)容如下
tcp進(jìn)行文件傳輸看這里–python實(shí)現(xiàn)TCP文件接發(fā)
這里實(shí)現(xiàn)的接收方一直接收,發(fā)送方每次發(fā)送一個(gè)文件,方便我在其他函數(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
#
# # 由客戶(hù)端向服務(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í)候,數(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('請(qǐng)輸入文件名:')
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') # 存儲(chǔ)接收到的數(shù)據(jù),文件名
print(f'接收到的文件信息{recv_file_info}')
c_address = recv_data[1] # 存儲(chǔ)客戶(hù)的地址信息
# 打印客戶(hù)端ip
print(f'客戶(hù)端{(lán)c_address}連接')
# recv_data = udp_socket.recv()
# 接收客戶(hù)端信息
# 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:
# 從客戶(hù)端讀取數(shù)據(jù)
bytes_read = udp_socket.recv(Buffersize)
# 如果沒(méi)有數(shù)據(jù)傳輸內(nèi)容
# print(bytes_read)
if bytes_read == b'file_download_exit':
print('完成傳輸!')
print(bytes_read)
break
# 讀取寫(xiě)入
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)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Python實(shí)現(xiàn)基于HTTP文件傳輸實(shí)例
- Python實(shí)現(xiàn)的簡(jiǎn)單文件傳輸服務(wù)器和客戶(hù)端
- python實(shí)現(xiàn)的一個(gè)p2p文件傳輸實(shí)例
- python使用tcp實(shí)現(xiàn)局域網(wǎng)內(nèi)文件傳輸
- python3.5基于TCP實(shí)現(xiàn)文件傳輸
- python cs架構(gòu)實(shí)現(xiàn)簡(jiǎn)單文件傳輸
- python 使用poster模塊進(jìn)行http方式的文件傳輸?shù)椒?wù)器的方法
- 樹(shù)莓派采用socket方式文件傳輸(python)
- python基于xmlrpc實(shí)現(xiàn)二進(jìn)制文件傳輸?shù)姆椒?/li>
- python實(shí)現(xiàn)FTP文件傳輸?shù)姆椒ǎǚ?wù)器端和客戶(hù)端)