1. 程式人生 > >檔案下載器專案

檔案下載器專案

這個專案的本質是在tcp伺服器上的一次演進,將客戶端與伺服器之間的資料流記錄到檔案當中。程式碼中初步加入了異常捕獲,因為沒有使用多程序等技術,看起來還是挺簡陋的。 客戶端的程式碼書寫

import socket

def main():
    client_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    dest_ip = input("請輸入下載伺服器的ip:")
    dest_port = int(input("請輸入伺服器的埠:"))
    client_sock.connect((dest_ip,dest_port))
    
    down_file = input("請輸入要下載的檔名")
    client_sock.send(down_file.encode("utf-8"))
    recv_data = client_sock.recv(1024)
    #對於with 寫法有效的保證了開啟檔案後的異常,但對於開啟檔案時出現異常無能為力
    if recv_data:
        with open("[新]"+down_file,"wb") as f:
            f.write(recv_data)
    client_sock.close()

if __name__ == "__main__":
    main()

伺服器端的程式碼書寫

import socket
def send_file_2_client(new_client_socket,client_addr):
    file_name = new_client_socket.recv(1024).decode("gbk")
    print("客戶端(%s)需要下載的檔案是:%s" % (str(client_addr), file_name))
    file_content = None
    #這個地方避免打卡檔案異常,因為經常會有檔案異常
    try:
        f = open(file_name,"rb")
        file_content = f.read()
        f.close()
    except Exception as ret:
        print("沒有要下載的檔案(%s)" % file_name)
        
    #在客戶端和這裡都加入了檔案是否存在的判斷
    if file_content:
         new_client_socket.send(file_content)

def main():
    tcp_serve_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    tcp_serve_socket.bind(("",7788))
    tcp_serve_socket.listen(128)
    while True:
        new_client_socket,client_addr = tcp_serve_socket.accept()
        # file_name = new_client_socket.recv(1024).decode("gbk")
        # print("客戶端(%s)需要下載的檔案是:%s" % (str(client_addr),file_name))
        # new_client_socket.send(b"tangsai----ok-----")

        send_file_2_client(new_client_socket, client_addr)
        new_client_socket.close()
    tcp_serve_socket.close()
if __name__ == "__main__":
    main()

這個專案到後面還很大的修改空間