python用tcp實現局域網內文件傳輸(文本,圖片,視頻)

功能:
可以利用python創建的TCP客戶端從我們自己搭建的TCP服務器上下載文件.
實現需求:
安裝socket模塊
簡單瞭解sokcet模塊用法

服務器代碼如下:

import socket


def file_deal(file_name):
    # 定義函數用於處理用戶索要下載的文件
    try:
        # 二進制方式讀取
        files = open(file_name, "rb")

        mes = files.read()

    except:


        print("沒有該文件")

    else:

        files.close()

        return mes

def main():
    # 創建套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 固定端口號
    tcp_socket.bind(("",8888))
    # 將主動套接字轉爲被動套接字
    tcp_socket.listen(128)

    while True:
        # 利用accept獲取分套接字以及客戶端的地址
        client_socket,client_addr = tcp_socket.accept()
        # 接收客戶端的數據
        file_name = client_socket.recv(4096)
        # 調用函數處理用戶下載的文件
        mes = file_deal(file_name)

        if mes:
            # 如果文件不爲空發送

            client_socket.send(mes)
        #關閉分套接字

        client_socket.close()



if __name__ == "__main__":
    main()

import socket


def file_deal(file_name):
    # 定義函數用於處理用戶索要下載的文件
    try:
        # 二進制方式讀取
        files = open(file_name, "rb")

        mes = files.read()

    except:


        print("沒有該文件")

    else:

        files.close()

        return mes

def main():
    # 創建套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 固定端口號
    tcp_socket.bind(("",8888))
    # 將主動套接字轉爲被動套接字
    tcp_socket.listen(128)

    while True:
        # 利用accept獲取分套接字以及客戶端的地址
        client_socket,client_addr = tcp_socket.accept()
        # 接收客戶端的數據
        file_name = client_socket.recv(4096)
        # 調用函數處理用戶下載的文件
        mes = file_deal(file_name)

        if mes:
            # 如果文件不爲空發送

            client_socket.send(mes)
        #關閉分套接字

        client_socket.close()



if __name__ == "__main__":
    main()

客戶端代碼:

from socket import *
import os


def main():
    # 建立套接字
    tcp_socket = socket(AF_INET, SOCK_STREAM)
    # 接收用輸入的服務器端的ip和端口
    tcp_ip = input("請輸入ip:")

    tcp_port = int(input("請輸入端口:"))
    # 連接服務器
    tcp_socket.connect((tcp_ip, tcp_port))
    # 輸入要下載的文件名
    file_name = input("請輸入要下載的文件名:")

    # 將文件名發送至服務器端
    tcp_socket.send(file_name.encode())
    # 創建一個空文件
    new_file = open(file_name, "wb")
    # 用與計算讀取的字節數
    time = 0

    while True:
        # 接收服務器端返回的內容
        mes = tcp_socket.recv(4096)
        # 如果內容不爲空執行
        if mes:
            # 解碼並向文件內寫入
            new_file.write(mes.decode())

            # 計算字節
            time += len(mes)

        else:
            # 如果字節數爲空即未收到內容
            if time == 0:
                # 關閉文件
                new_file.close()
                # 刪除剛剛創建的文件
                os.remove(file_name)
                print("沒有您要下載的文件")
            else:
                # 如過time有值時name文件傳輸完成
                print("文件下載成功")

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


if __name__ == '__main__':
main()
發佈了36 篇原創文章 · 獲贊 31 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章