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()