本文實例為大家分享了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)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Python實現基于HTTP文件傳輸實例
- Python實現的簡單文件傳輸服務器和客戶端
- python實現的一個p2p文件傳輸實例
- python使用tcp實現局域網內文件傳輸
- python3.5基于TCP實現文件傳輸
- python cs架構實現簡單文件傳輸
- python 使用poster模塊進行http方式的文件傳輸到服務器的方法
- 樹莓派采用socket方式文件傳輸(python)
- python基于xmlrpc實現二進制文件傳輸的方法
- python實現FTP文件傳輸的方法(服務器端和客戶端)