Python文件传输

关于python的文件传输我们可以利用socket模块来进行通信传输

服务端

import os
import json
import socket
import threading

class ServerIdea:
    def server_idae(conn, addr):
        while True:
            msg = conn.recv(1024).decode('utf-8')
            flag = msg.split()
            if msg == 'ls':
                print(f'{addr[0]}:{addr[1]}\tls')
                ServerIdea.s_ls_idea(conn)
            elif flag[0] == 'put':
                ServerIdea.s_put_idea(conn, addr, flag[1])
            elif flag[0] == 'get':
                ServerIdea.s_get_idea(conn, addr, flag[1])

    def s_ls_idea(conn):
        file_list = str(os.listdir(r'.\swap'))
        conn.sendall(bytes(str(len(file_list)), 'utf-8').zfill(8))
        conn.sendall(file_list.encode('utf-8'))

    def s_put_idea(conn, addr, file):
        if file in os.listdir('.\\swap\\'):
            conn.sendall('1'.encode('utf-8').zfill(1))
            return
        else:
            conn.sendall('0'.encode('utf-8').zfill(1))
        header_size = int(conn.recv(4).decode('utf-8'))
        header = json.loads(conn.recv(header_size).decode('utf-8'))
        print(f'{addr[0]}:{addr[1]}\tput {file}\tsize:{header["Size"]}')
        add_size = 0
        with open('.\\swap\\' + header['Name'], 'wb')as f1:
            while add_size < int(header['Size']):
                swap = conn.recv(1024)
                add_size += len(swap)
                f1.write(swap)

    def s_get_idea(conn, addr, file):
        if not file in os.listdir('.\\swap\\'):
            conn.sendall('1'.encode('utf-8').zfill(1))
            return
        else:
            conn.sendall('0'.encode('utf-8').zfill(1))
        header = {
            'Name': file,
            'Size': os.path.getsize('.\\swap\\' + file)
        }
        print(f'{addr[0]}:{addr[1]}\tget {file}\tsize:{header["Size"]}')
        conn.sendall(bytes(str(len(json.dumps(header))), 'utf-8').zfill(4))
        conn.sendall(json.dumps(header).encode('utf-8'))
        with open('.\\swap\\' + file, 'rb')as f1:
            while True:
                swap = f1.read(1024)
                if not swap:
                    break
                conn.sendall(swap)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', 4001))
s.listen(5)

while True:
    conn, addr = s.accept()
    print(addr)
    threading.Thread(target = ServerIdea.server_idae, args = (conn, addr, ), daemon = True).start()

客户端

import os
import json
import socket

class ClientIdea:
    def c_ls_idea(msg):
        c.sendall(msg.encode('utf-8'))
        data_size = int(c.recv(8).decode('utf-8'))
        add_size = 0
        data = b''
        while add_size < data_size:
            swap = c.recv(1024)
            add_size += len(swap)
            data += swap
        for file in eval(data):
            print(file)

    def change_file():
        print('服务器未连接,请重新输入!')
        with open('config.ini', 'w', encoding = 'utf-8')as f1:
            f1.write(input('服务器ip:') + ' ')
            f1.write(input('服务器端口:'))

    def c_put_idea(msg, flag):
        if not os.path.exists(flag[1]):
            print('本地没有此文件!')
            return
        c.sendall(str(flag[0] + ' ' + os.path.basename(flag[1])).encode('utf-8'))
        if c.recv(1).decode('utf-8') == '1':
            print('服务器已有此文件!')
            return
        header = {
            'Name': os.path.basename(flag[1]),
            'Size': os.path.getsize(flag[1])
        }
        c.sendall(bytes(str(len(json.dumps(header))), 'utf-8').zfill(4))
        c.sendall(json.dumps(header).encode('utf-8'))
        add_size = 0
        with open(flag[1], 'rb')as f1:
            while True:
                swap = f1.read(1024)
                if not swap:
                    break
                c.sendall(swap)
                add_size += len(swap)
                print(f'上传中...\t{int(add_size / header["Size"] * 100)}%\r', end = '')
        print('上传成功!')

    def c_get_idea(msg, flag):
        if os.path.exists(flag[1]):
            print('本地已有此文件!')
            return
        c.sendall(msg.encode('utf-8'))
        if c.recv(1).decode('utf-8') == '1':
            print('服务器没有此文件!')
            return
        header_size = int(c.recv(4).decode('utf-8'))
        header = json.loads(c.recv(header_size).decode('utf-8'))
        add_size = 0
        with open(header['Name'], 'wb')as f1:
            while add_size < int(header['Size']):
                swap = c.recv(1024)
                add_size += len(swap)
                f1.write(swap)
                print(f'下载中...\t{int(add_size / header["Size"] * 100)}%\r', end = '')
        print('下载成功!')

c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
if not 'config.ini' in os.listdir():
    ClientIdea.change_file()
while True:
    with open('config.ini', 'r', encoding = 'utf-8')as f1:
        ip, port = f1.read().split()
        try:
            if c.connect_ex((ip, int(port))):
                ClientIdea.change_file()
            else:
                break
        except:
            ClientIdea.change_file()

while True:
    msg = input('>').strip()
    if not msg:
        continue
    flag = msg.split()
    if len(flag) == 1 and msg == 'ls':
        ClientIdea.c_ls_idea(msg)
    elif len(flag) == 2 and flag[0] == 'put':
        ClientIdea.c_put_idea(msg, flag)
    elif len(flag) == 2 and flag[0] == 'get':
        ClientIdea.c_get_idea(msg, flag)

以上代码是我用python写的一个关于文件传输的小网盘

服务端用到了多线程来让多个客户端连接进来分开通信,然后定义了一个类,里面写了4个方法server_idae主要是用来接收客户端希望进行的操作,其他的就是对应客户端上传和下载的方法,还有一个ls_idea是用来查看服务器的文件的

客户端也使用了三个方法来对应服务端的方法。

在文件传输的时候通过json模块来发送文件的一些信息比如大小、名称之类的并且可以通过名称来判断文件是否存在。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值