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

客戶端:

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()
相關文章
相關標籤/搜索