1. 程式人生 > >tcp文件下載客戶端+服務端

tcp文件下載客戶端+服務端

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文件下載客戶端+服務端