python基於tcp協議實現客戶端從服務器進行文件下載

    用python實現一個機遇tcp協議的服務器和客戶端,服務器存儲文件,客戶端從服務器請求文件下載,互相通信。

1.tcp協議的服務器實現

from socket import  *
import sys

def get_filecontent(file_name):

     '''方法的作用是讀取文件內容給客戶端'''
     try:
        with open(file_name,'rb') as f:
            content = f.read()
            return content
     except  FileNotFoundError :
         print("沒有找到文件%s"%file_name)

def main():

    # 1.創建socket
    tcp_socket = socket(AF_INET,SOCK_STREAM)

    # 2.綁定服務器端口
    address = ("",7788)
    tcp_socket.bind(address)

    #3.將主動套接字改成被動模式
    tcp_socket.listen(128)

    while True:
        # 4.等待對方客戶端連接
        client_socket ,client_addr = tcp_socket.accept()

        # 5.接受對方客戶端的數據
        recv_data = client_socket.recv(1000000) #這個表示單次連接傳輸文件大小,用戶根據實際自定
        file_name = recv_data.decode("utf-8")
        print("對方請求下載的文件名爲:%s"%file_name)

        #調用上面的函數,實現讀取文件內容
        file_content = get_filecontent(file_name)
        print(file_content)
        if file_content :
            client_socket.send(file_content)
            #  因爲獲取打開文件時是以rb方式打開,所以file_content中的數據已經是二進制的格式,因此不需要encode編碼

        #關閉這個客戶端套接字
        client_socket.close()

    #關閉監聽套接字
    tcp_socket.close()

if __name__ == '__main__':
    main()

2.TCP實現客戶端

from socket import *

def main():
    #1.創建客戶端套接字
    tcp_client_socket =socket(AF_INET,SOCK_STREAM)

    #2.與服務器建立連接
    dest_server = ("127.0.0.1",7788)
    tcp_client_socket.connect(dest_server)

    # 3.數據發送,請求下載
    send_Msg = input("請輸入需要下載的文件名稱:")

    tcp_client_socket.send(send_Msg.encode("utf-8"))

    #4.數據接收 ,寫入本地
    recv_Msg =  tcp_client_socket.recv(10000000000)  #因爲這裏是接收文件,所以將單此傳輸文件大小要設置的大一些。
   # print('接收到的數據爲:', recv_Msg.decode('utf-8'))
    if recv_Msg:
        with open('aaa_copy.txt',"wb") as f : #注意,這裏必須要是wb寫入模式,否則亂碼,因爲打開是rb模式。
            f.write(recv_Msg)
        print("下載成功,請查看!")
    else :
        print("沒有下載成功")
    #5.關閉套接字
    tcp_client_socket.close()

if __name__ == '__main__':
    main()

3.通信實現客戶端從服務器端請求下載文件

1.先啓動服務器程序,

2.再啓動客戶端程序,輸入需要下載的文件名稱 

D:\software\python3\python.exe D:/pythoyworkspace/d_demo.py
請輸入需要下載的文件名稱:aaa.txt
下載成功,請查看!

Process finished with exit code 0
對方請求下載的文件名爲:aaa.txt

 3.最後在服務器當前目錄下查看文件,注意存放在服務器上的文件,必須要在程序的當前目錄下,不然找不到哈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章