Python實現TCP文件傳輸


廢話少說,直接上代碼

 1 # 發送端
 2 import socket,os
 3 from struct import pack
 4 
 5 def send_file(file_name,file_socket:socket.socket):
 6     try:
 7         f = open(file_name,'rb')
 8         size = os.path.getsize(file_name)
 9         if size < 1024:
10             read_size = 500
11         elif size < 1024*1024 and size >= 1024:
12             read_size = 500*1024
13         else:
14             read_size = 500*1024*1024
15         file_socket.send(pack('q',size))
16         del size
17         file_socket.recv(1024)
18         while True:
19             data = f.read(read_size)
20             if not data:
21                 break
22             file_socket.send(data)
23         f.close()
24     except FileNotFoundError:
25         print(f'沒有找到{file_name}')
26 
27 if __name__ == '__main__':
28     try:
29         file_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
30         file_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
31         ip = str(input('請輸入接收端IP:'))
32         port = int(input('請輸入接收端端口號:'))
33         file_socket.connect((ip,port))
34         print('連接成功,准備開始傳輸。。。')
35         path = r'%s' % (input('請輸入文件所在文件夾:') + '/')
36         print(file_socket.recv(1024).decode('gbk'))
37         file_name = str(input())
38         file_socket.send(file_name.encode('gbk'))
39         send_file(path + file_name,file_socket)
40     except ConnectionResetError:
41         print('接收端斷開連接')
 1 # 接收端
 2 import socket,os
 3 from time import time
 4 from struct import unpack
 5 from tqdm import tqdm
 6 
 7 DOWNLOAD_PATH = 'D:/Python文件傳輸/' # 傳輸目錄
 8 
 9 def download(file_name,file_socket:socket.socket):
10     file_size = unpack('q',file_socket.recv(1024))[0]
11     if file_size < 1024:
12         print(f'文件大小:{file_size} B')
13     elif file_size < 1024*1024 and file_size >= 1024:
14         print(f'文件大小:{file_size/1024} KB')
15     else:
16         print(f'文件大小:{file_size/(1024*1024)} MB')
17     f = open(file_name,'wb')
18     print('開始傳輸...')
19     download_size = 2048
20     file_socket.send('開始傳輸'.encode('gbk'))
21     start = time()
22     for i in tqdm(range(int(file_size/download_size) + 1)):
23         data = file_socket.recv(download_size)
24         f.write(data)
25     end = time()
26     f.close()
27     print('傳輸完成!')
28     print(f'大約耗時{end - start}秒')
29 
30 if __name__ == '__main__':
31     os.chdir(DOWNLOAD_PATH)
32     try:
33         file_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
34         file_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
35         file_socket_port = int(input('請輸入端口號:'))
36         file_socket.bind(('',file_socket_port))
37         print('成功啟動,等待連接。。。')
38         file_socket.listen(1)
39         f_socket, f_addr = file_socket.accept()
40         print(f'建立連接{f_addr}')
41         f_socket.send('請輸入文件名'.encode('gbk'))
42         file_name = f_socket.recv(1024)
43         download(file_name.decode('gbk'),f_socket)
44         f_socket.close()
45         file_socket.close()
46     except ConnectionResetError:
47         print('發送端已斷開連接')
48     except UnicodeDecodeError:
49         print('文件編碼錯誤,請檢查文件格式是否正確')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM