1. 程式人生 > >Python學習---網絡文件上傳

Python學習---網絡文件上傳

pat family jpg roc lba conn input 最大 socket

中心思想: 傳遞過去文件的大小,根據文件的大小判斷是否文件上傳完成; 傳遞/接受文件采用分流的形式,每次傳遞/接受部分數據; 文件的讀取均采用絕對路徑實現,而且是bytes的形式讀寫

客戶端:

# 客戶端
import socket
import  os
# family=AF_INET,   代表使用IPV4的IP協議
# type=SOCK_STREAM  代表使用TCP協議進行連接
client = socket.socket()
ip_addr = (‘127.0.0.1‘, 9999)
BasePath = os.path.dirname(os.path.abspath(__file__))
while True:
    client.connect(ip_addr)
    inp = input(‘>>>:‘)           # post | hhh.jpg
    cmd, path = inp.split(‘|‘)
    path = os.path.join(BasePath, path)
    filename = os.path.basename(path)
    file_size = os.stat(path).st_size
    file_info = ‘%s|%s|%s‘ % (cmd, filename, file_size)
    client.sendall(bytes(file_info, ‘utf-8‘))
    file_send = 0
    with open(path, ‘rb‘) as f:
        while file_send != file_size:
            data = f.read(1024)
            client.send(data)
            file_send += len(data)
    print(‘上傳成功!‘)
    client.close()
    break
client.close()

服務器端:

# 服務端
import socket
import subprocess
import os
# family=AF_INET,   代表使用IPV4的IP協議
# type=SOCK_STREAM  代表使用TCP協議進行連接

server = socket.socket()  # 創建socket
ip_addr = (‘127.0.0.1‘, 9999)  # 1024之前的端口,默認是OS使用
server.bind(ip_addr)           # 要求必須是一個元組
server.listen(3)               # 開始監聽傳入連接。在拒絕連接之前,可以掛起的最大連接數量。
BasePath = os.path.dirname(os.path.abspath(__file__))
while True:
    conn, addr = server.accept()  # 接受連接並返回(conn,address)
                                  # 其中conn是新的套接字對象[客戶端],可以用來接收和發送數據。
                                  # address是連接客戶端的地址。
    while 1:
        data = str(conn.recv(1024), ‘utf-8‘)
        cmd, file_name, file_size = data.split(‘|‘)
        path = os.path.join(BasePath, ‘hhh‘, file_name)
        file_size = int(file_size)
        rec_size = 0
        with open(path, ‘ab‘) as f:
            while rec_size != file_size:
                data = conn.recv(1024)
                rec_size += len(data)
                f.write(data)
        print(‘接受成功!‘)
        break
    conn.close()
server.close()

Python學習---網絡文件上傳