zoukankan      html  css  js  c++  java
  • python_day26__02__文件的传送

    #Author:'haijing'
    #date:2018/11/14

    #直接拖动一张图片到该软件的目录下
    #创建一个yuan的package,把该图片发送到yaun的package中去
    #文件传送,要告诉对方你要传送的文件的名字是什么,因为要在对方某个地方存储,没有名字怎么存储呢
    #还要告诉对方文件的大小是多少,以便于传送,(判断传送是否完成)


    #post_server服务端:在别人的哪里
    #必须线开启server端

    import socket #socket是一个接口 内部封装了有关ip地址和端口号的信息 并且创建ip和端口号
    import subprocess #下面目前就使用一个类Popen,让代码在dos环境下运行
    import os

    sk = socket.socket() #创建一个socket对象s 服务端的sk对象和客户端的sk对象完全是不一样的
    address = ('127.0.0.1',8000) #设置一个元组,元组内放的是ip和端口号:8000
    sk.bind(address) #绑定ip和端口号,bind方法后跟的必须是一个元组
    sk.listen(3) #3表示服务端最多和三个客户端同时建立通信,但是传送信息的话只能是一个一个的来
    print('waiting...')
    BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #那个post_server.py的上一级目录

    while 1:
    conn,addr = sk.accept() # 客户端开启之后就一直在这里等待着
    #接收将要接收的文件信息
    data = conn.recv(1024)
    cmd,file_name,file_size = str(data,'utf8').split('|')#先将接收到的data转换为str类型的,再以竖线将str格式的data分开,分别传给三个变量
    path = os.path.join(BASE_DIR,'yuan',file_name) #yuan是在post_server上级目录中一个包的名字
    file_size = int(file_size)

    #接收要写入的文件
    f = open(path,'ab') #a表示如果没有该路径path,那么就去创建该路径,b是以bytes类型写,打开文件
    has_receive = 0
    print('开始写入')
    while has_receive != file_size:
    data = conn.recv(1024)
    f.write(data)
    has_receive += len(data)
    f.close()
    print('写入成功')


    #Author:'haijing'
    #date:2018/11/14

    #post_client客户端
    #必须线开启server端
    #此代码可以执行输入的dos环境下的命令,并返回执行的命令的结果

    import socket
    import os

    sk = socket.socket() #创建socket对象 服务端的sk对象和客户端的sk对象完全是不一样的
    address = ('127.0.0.1',8000) #设置元组 里面放的是需要连接的服务器的ip地址
    sk.connect(address) #连接ip地址为127.0.0.1的服务端

    BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #post_client.py的上一级目录
    while 1:
    #jing发 不能发空,否则对方会停在阻塞的状态
    inp_jing = input('>>>') #输入上传的命令,例如post|post.jpg 这里是相对路径
    cmd,path = inp_jing.split('|') #以竖线将输入的内容分开,并分别传递给cmd和path
    path = os.path.join(BASE_DIR,path) #路径的拼接,生成要上传的文件的绝对路径

    file_name = os.path.basename(path) #basename的作用是取到path最后的文件名字 例此时filename=post.jpg
    file_size = os.stat(path).st_size #拿到文件的大小,例post.jpg文件的大小

    #发送文件信息
    file_info = 'post|%s|%s' %(file_name,file_size) #字符串拼接
    sk.sendall(bytes(file_info,'utf8')) #首先给server端发送要发送的命令和文件信息

    #发送文件
    # with open(path,'rb') as f #rb表示以bytes读
    f = open(path,'rb')
    has_send = 0
    print('开始发送')
    while has_send != file_size:
    data = f.read(1024) #一次读1024个字节的数据,以为是以bytes类型读的,所以是字节
    sk.sendall(data)
    has_send +=len(data)
    f.close()
    print('发送成功')

    sk.close #关的此客户端是和服务端之间的通信通道,同样server端也是有关掉通信通道的能力,但是server端一般是不会关的

  • 相关阅读:
    such用法
    divorce用法
    towel用法
    go for用法
    catch on用法
    incredibly用法
    mess用法
    dentist用法
    steer clear of用法
    incredible
  • 原文地址:https://www.cnblogs.com/YiYA-blog/p/9960846.html
Copyright © 2011-2022 走看看