python實現簡單的tcp 檔案下載
阿新 • • 發佈:2020-09-17
什麼是下載?
首先客戶端會問伺服器,有沒有一個xxx的檔案啊?伺服器開始尋找,找到後對客戶端說有,然後客戶端在本地新建一個檔案,客戶端從伺服器收到一點資料,就寫進這個檔案中,再收到一點資料,再寫入這個檔案中,只要把所有的接收到的資料都寫入到這個檔案中,就完成了下載的操作。
所以下載需要2個部分。伺服器的傳送方和客戶端的接收方。
我們這裡不考慮複雜的情況。什麼限速啊,驗證啊,檔案大小......只實現最簡單的邏輯。
客戶端參考程式碼
import socket def main(): # 建立socket tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 目的資訊 server_ip = input("請輸入伺服器ip:") server_port = int(input("請輸入伺服器port:")) # 連結伺服器 tcp_client_socket.connect((server_ip,server_port)) # 輸入需要下載的檔名 file_name = input("請輸入要下載的檔名:") # 傳送檔案下載請求 tcp_client_socket.send(file_name.encode("utf-8")) # 接收對方傳送過來的資料,最大接收1024個位元組(1K) recv_data = tcp_client_socket.recv(1024) # 如果接收到資料再建立檔案,否則不建立 if recv_data: with open("[接收]"+file_name,"wb") as f: f.write(recv_data) # 關閉套接字 tcp_client_socket.close() if __name__ == "__main__": main()
服務端參考程式碼
import socket import sys def get_file_content(file_name): """獲取檔案的內容""" try: with open(file_name,"rb") as f: content = f.read() return content except: print("沒有下載的檔案:%s" % file_name) def main(): if len(sys.argv) != 2: print("請按照如下方式執行:python3 xxx.py 7890") return else: # 執行方式為python3 xxx.py 7890 port = int(sys.argv[1]) # 建立socket tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 本地資訊 address = ('',port) # 繫結本地資訊 tcp_server_socket.bind(address) # 將主動套接字變為被動套接字 tcp_server_socket.listen(128) while True: # 等待客戶端的連結,即為這個客戶端傳送檔案 client_socket,clientAddr = tcp_server_socket.accept() # 接收對方傳送過來的資料 recv_data = client_socket.recv(1024) # 接收1024個位元組 file_name = recv_data.decode("utf-8") print("對方請求下載的檔名為:%s" % file_name) file_content = get_file_content(file_name) # 傳送檔案的資料給客戶端 # 因為獲取開啟檔案時是以rb方式開啟,所以file_content中的資料已經是二進位制的格式,因此不需要encode編碼 if file_content: client_socket.send(file_content) # 關閉這個套接字 client_socket.close() # 關閉監聽套接字 tcp_server_socket.close() if __name__ == "__main__": main()
以上就是python實現簡單的tcp檔案下載的詳細內容,更多關於python tcp下載的資料請關注我們其它相關文章!