什么是下載?
首先客戶端會問服務器,有沒有一個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()