Python实现文件上传与下载

import sys
import socket
import getopt
import time

upFileName = ""

#服务端涵数
def server_handle(port):
    #创建服务端套接字
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    #绑定IP和端口
    server.bind(('0.0.0.0', port))

    #监听
    server.listen(10)

    print("[*] Listening on 0.0.0.0:%d"%port)

    while True:
        client_socket, addr = server.accept()
        download_file(client_socket)

#客户端涵数
def client_handle(target, port):
    #创建socket连接
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((target, port))

    #将字符串文件名转成字节发送,socket套接字是要用byte传输
    client.send(upFileName.encode('utf-8'))
    time.sleep(1)
    upload_file(client)

    #传输完文件后关闭文件流
    client.close()

#文件下载涵数
def download_file(socket):
    #读取socket传过来的文件名数据
    fileName = socket.recv(1024)

    #因为socket传过来的是字节码,所以这里需要转成字符串
    fileName = fileName.decode()
    print("[*]Receive the file:%s"%fileName)

    #定义一个byte型的变量
    fileBuffer = "".encode('utf-8')

    #循环从socket中读取数据
    while True:
        #一次读取1024个字节
        data = socket.recv(1024)
        if data:
            #读取的数据累加保存在变量中
            fileBuffer += data
        else:
            #如果读到没有数据了就跳出结束
            break;

    #以写字节的形式打开一个文件
    f = open("_"+fileName, 'wb')
    #写文件
    f.write(fileBuffer)
    #关闭打开的文件
    f.close()

#文件上传涵数
def upload_file(socket):
    #以读byte字节的形式打开文件
    f = open(upFileName, 'rb')

    #读取文件
    data = f.read()

    #关闭打开文件
    f.close()

    #发送文件数据
    socket.send(data)

#定义usage涵数(命令行提示信息)
def usage():
    print("help info: python upload.py -h")
    print("client: python upload.py -t [target] -p [port] -u [uploadfile]")
    print("server: python filename.py -lp [port]")
    sys.exit()

def main():
    global upFileName   #文件名
    target = ""     #目标IP
    port = 0        #目标端口
    help = False    #显示帮助信息
    listen = False  #是否监听

    #利用getopt模块获取命令行参数
    opts, args = getopt.getopt(sys.argv[1:], "t:p:u:hl")
    for o, a in opts:
        if o == "-t":
            target = a;
        elif o == "-p":
            port = int(a)
        elif o == "-u":
            upFileName = a
        elif o == "-h":
            help = True
        elif o == "-l":
            listen = True
        else:
            #断言,传入的参数有误
            assert False, "Unhandled Option"


    #打印帮助信息
    if help:
        usage()

    #区分客户端和服务端
    if listen:
        server_handle(port)
    else:
        client_handle(target, port)

if __name__ == "__main__":
    main()

 

你可能感兴趣的:(python)