本文實例為大家分享了python實現文件夾遠程傳輸的具體代碼,供大家參考,具體內容如下
實現功能:
通過tcp協議模擬文件夾的下載,注意是文件夾,不是文件。
下面讓我們實現以下:
其中有部分功能還未實現有興趣的可以將代碼自行補全
服務器端代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
import os import socket import time # 定義全局列表用來存儲子文件夾 list1 = [] def deal_file(files,dir_name,dir_socket): # 如果打開文件時報錯即files為文件夾 try : old_file = open (os.path.join(dir_name.decode(),files), "rb" ) except : # 講導致報錯的文件夾放入全局列表等待處理 global list1 list1.append(files) else : # 沒有報錯則執行讀取發送關閉文件 file_data = old_file.read() print ( "發送內容" ) dir_socket.send(file_data) old_file.close() def deal_dir(): # 待完善用于處理子文件夾,需要利用遞歸完成 pass def main(): # 創建套接字 tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 固定端口號 tcp_socket.bind(("", 9992 )) # 被動套接字轉換為主動套接字 tcp_socket.listen( 128 ) # 將隊列中的客戶端取出 dir_socket,client_ip = tcp_socket.accept() # 接受客戶端消息 dir_name = dir_socket.recv( 1024 ) # 顯示文件列表 file_list = os.listdir(dir_name.decode()) # 將文件列表發送至客戶端 dir_socket.send( str (file_list).encode()) # 阻塞0.5s等待發送成功 time.sleep( 0.5 ) # 便利每個文件發送文件內容 for files in file_list: deal_file(files, dir_name, dir_socket) global list1 # 如果全局列表內有文件則 if list1: # 帶完善 pass else : dir_socket.close() print ( "文件全部傳輸完成" ) tcp_socket.close() if __name__ = = '__main__' : main() |
客戶端源碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import socket import os import threading import time def recv_data(files,dir_name,tcp_socket): file_data = tcp_socket.recv( 1024 ) new_file = open (os.path.join(dir_name + "新" , files), "wb" ) new_file.write(file_data) new_file.close() print ( "文件%s下載完成" % files) def main(): # 創建套接字 tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 連接服務器 tcp_socket.connect(( "192.168.11.128" , 9992 )) # 向服務器發送要拷貝的文件夾 dir_name = input ( "請輸入要拷貝的文件夾" ) tcp_socket.send(dir_name.encode()) # 新建文件夾 os.mkdir(dir_name + "新" ) # 接受文件列表,循環打開文件寫入 file_list = tcp_socket.recv( 1024 ) a = eval (file_list) print (a) for files in eval (file_list.decode()): recv_data(files,dir_name,tcp_socket) if __name__ = = '__main__' : main() |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/wf134/article/details/78571811