tcp文件下載客戶端+服務端
阿新 • • 發佈:2018-05-29
des 讀取文件 個人 讀取 循環 用戶輸入 file listen 消息
客戶端:
import socket if __name__ == ‘__main__‘: # 創建tcp客戶端socket tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 和服務端socket建立連接 tcp_client_socket.connect(("192.168.131.106", 7878)) # 接收用戶輸入的文件名 file_name = input("請輸入您要下載的文件對應的名字:") # 對字符串進行編碼 file_name_data = file_name.encode("gbk") # 發送下載文件的請求信息 tcp_client_socket.send(file_name_data) # 定義二進制空的數據 result_file_data = b"" # 循環接收數據 while True: # 獲取服務端發送的文件二進制數據 file_data = tcp_client_socket.recv(1024) if file_data: # 拼接每次讀取的數據 result_file_data += file_data else: break # 判斷文件是否有數據 if result_file_data: # 寫入到指定文件裏面, with open 文件操作完成以後關閉文件是系統自己操作的 with open("/home/python/Desktop/" + file_name, "wb") as file: file.write(result_file_data) else: print("文件為空") # 關閉socket tcp_client_socket.close()
服務端:
import socket import os if __name__ == ‘__main__‘: # 創建tcp服務端socket tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 綁定端口號 tcp_server_socket.bind(("", 7878)) # 設置監聽,把主動套接字改成被動套接字,被動套接字只能接收客戶端連接請求,不能收發消息,收發消息使用新的套接字 tcp_server_socket.listen(128) # 註意點:目前服務端是單任務的一個人下載完成以後另外一個人才能再下載 # 循環接收客戶端連接請求 while True: # 等待接收客戶端的連接請求 tcp_service_socket, ip_port = tcp_server_socket.accept() print(ip_port) # 接收客戶端的請求信息,其實文件名 file_name_data = tcp_service_socket.recv(1024) # 對二進制數據進行解碼獲取文件名字符串 file_name = file_name_data.decode("gbk") # "路徑/" + file_name 判斷指定路徑是否有對應的文件 # file_name在當前工程判斷該文件是否存在 if os.path.exists(file_name): # 打開指定文件把數據發送給客戶端 with open(file_name, "rb") as file: while True: # 讀取文件中的數據 file_data = file.read(1024) # 判斷數據是否為空 if file_data: # 發送數據給客戶端 tcp_service_socket.send(file_data) else: break print(file_name, ip_port) # 和客戶端終止服務 tcp_service_socket.close() # 關閉服務端套接字,以後不再接收客戶端的連接請求 tcp_server_socket.close()
tcp文件下載客戶端+服務端