1. 程式人生 > >python高階(一)——網路程式設計Socket(2)檔案下載案例

python高階(一)——網路程式設計Socket(2)檔案下載案例

1、伺服器

import socket


def send_file_2_client(new_client_socket, client_addr):
    # 1 接收客戶端,需要下載的檔名
    # 接收客戶端傳送來的請求
    file_name = new_client_socket.recv(1024).decode("utf-8")
    print("%s 下載檔案是:%s" % (str(client_addr), file_name))

    file_content = None
    # 2 開啟檔案,讀取資料
    try:
        f = open(file_name, "rb")
        file_content = f.read()
        f.close()
    except Exception as ret:
        print("Wrong %s" % file_name)

    # 3 傳送檔案的資料給客戶端
    if file_content:
        new_client_socket.send(file_content)


def server():
    # 建立socket
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 繫結本地資訊
    tcp_socket.bind("", 7890)
    # 預設套接字由主動變為被動
    tcp_socket.listen(128)

    while True:
        # 等待客戶端連線
        new_client_socket, client_addr = tcp_socket.accept()

        send_file_2_client(new_client_socket, client_addr)

        new_client_socket.close()
    tcp_socket.close()


if __name__ == '__main__':
    server()

2、客戶端

import socket


def client():
    # 1 建立套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2 獲取束縛器的ip port
    dest_ip = input("伺服器ip:")
    dest_port = int(input("伺服器port:"))

    # 3 連結伺服器
    tcp_socket.connect(dest_ip, dest_port)

    # 4 獲取下載的檔名字
    download_file_name = input("下載檔名")

    # 5 將檔名傳送到伺服器
    tcp_socket.send(download_file_name.encode("utf-8"))

    # 6 接收檔案中的資料
    recv_data = tcp_socket.recv(1024)

    if recv_data:
        # 7 儲存接收的資料到檔案中
        with open("[new]" + download_file_name, "wb") as f:
            f.write(recv_data)

    # 8 關閉套接字
    tcp_socket.close()



if __name__ == '__main__':
    client()