作业:

1\ 默写 黏包协议

2\ 上传大文件(文件\视频\图片)

3\ 和你的同桌调通 从你的计算机上传一个视频到你同桌的电脑上

4\ 进阶 : 带上登录

Server

#Server
#!/usr/bin/env python
# encoding: utf-8
# Author: meimeilong <2559184081@qq.com>
# Create Date: 2019-04-10 13:29:26
# Last Modified: 2019-04-10 13:29:26
# Description:
import os
import json
import struct
import socket

sk = socket.socket()
server_addr = ('0.0.0.0',9000)
sk.bind(server_addr)
sk.listen()
def bytes2human(n):
    symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
    prefix = {}
    for i, s in enumerate(symbols):
        prefix[s] = 1 << (i + 1) * 10
    for s in reversed(symbols):
        if n >= prefix[s]:
            value = float(n) / prefix[s]
            return '%.1f%s' % (value,s)
    return '%sB' % n
def FormatDic(head_dic):
    for key in head_dic:
        if key == 'filesize':
            print(key,bytes2human(head_dic[key]))
        else:
            print(key,head_dic[key])
    print('传输完成'.center(20,'='))
def GetFile(file_head,buffer=1024,dir='upload'):
    upfile = os.path.join(dir,file_head['filename'])
    filepath='pp.mp4'
    filesize = file_head['filesize']
    with open(upfile,'wb') as f:
        while filesize:
            if filesize >= buffer: #>=是因为如果刚好等于的情况出现也是可以的。
                content = conn.recv(buffer)
                f.write(content)
                filesize -= buffer
            else:
                content = conn.recv(buffer)
                f.write(content)
                return True

while True:
    conn,addr = sk.accept()
    dic_len = struct.unpack('i',conn.recv(4))[0]
    file_dic = conn.recv(dic_len).decode('utf-8')
    head_dic = json.loads(file_dic)
    FormatDic(head_dic)
    GetFile(head_dic)

    conn.close()
sk.close()
##Client
#!/usr/bin/env python
# encoding: utf-8
# Author: meimeilong <2559184081@qq.com>
# Create Date: 2019-04-10 13:31:44
# Last Modified: 2019-04-10 13:31:44
# Description:
import os
import sys
import time
import json
import struct
import socket

def GetHead(filepath):
    abspath = os.path.abspath(filepath)
    filename = os.path.basename(abspath)
    filedir = os.path.dirname(abspath)
    filesize = os.path.getsize(abspath)
    tcp_head = {
        'filename':filename,
        'filedir':filedir,
        'filesize':filesize,
    }
    return tcp_head

def SendHead(tcp_dic):
    str_dic = json.dumps(tcp_dic)
    bytes_dic = str_dic.encode('utf-8')
    num = struct.pack('i',len(bytes_dic))
    sk.send(num)
    sk.send(bytes_dic)
    return True

def progress(percent,width=50):
    '''进度打印功能'''
    if percent >= 100:
        percent=100
    show_str=('[%%-%ds]' %width) %(int(width * percent/100)*"#") #字符串拼接的嵌套使用
    print('\r%s %d%%' %(show_str,percent),end='')

def SendFile(file_head,buffer=1024,recv_size=0):
    filepath = os.path.join(file_head['filedir'],file_head['filename'])
    data_size = file_head['filesize']

    with open(filepath,'rb') as f:
        while data_size:
            if data_size >= buffer: #>=是因为如果刚好等于的情况出现也是可以的。
                content = f.read(buffer)
                sk.send(content)
                data_size -= buffer
                recv_size +=buffer
            else:
                content = f.read(buffer)
                sk.send(content)
                recv_size +=buffer
                return True
            recv_per=int(100*recv_size/data_size) #接收的比例
            progress(recv_per,width=30) #调用进度条函数,进度条的宽度默认设置为30

if __name__ == '__main__':
    sk = socket.socket()
    server_addr = ('127.0.0.1',9000)
    sk.connect(server_addr)

    filepath = input('>>>').strip()
    file_head = GetHead(filepath)
    SendHead(file_head)
    SendFile(file_head)
    sk.close()

Day29作业及默写的更多相关文章

  1. Day20作业及默写

    1.请使用C3算法计算出链接图中的继承顺序-Link 一 graph BT id1[A]-->id2[B] id2[B]-->id6[F] id6[F]-->id7[G] id1[A ...

  2. Day11作业及默写

    1.写函数,传入n个数,返回字典{'max':最大值,'min':最小值} 例如:min_max(2,5,7,8,4) 返回:{'max':8,'min':2}(此题用到max(),min()内置函数 ...

  3. Day10作业及默写

    1,继续整理函数相关知识点,写博客. 2,写函数,接收n个数字,求这些参数数字的和.(动态传参) def func(*number): sum=0 for num in number: sum+=nu ...

  4. Day14作业及默写

    1.整理今天所学内容,整理知识点,整理博客. pass 2.画好流程图. pass 3.都完成的做一下作业(下面题都是用内置函数或者和匿名函数结合做出): pass 4.用map来处理字符串列表,把列 ...

  5. Day13作业及默写

    1. 整理今天的博客,写课上代码,整理流程图. 博客链接--博客园 2. 写一个函数完成三次登陆功能: 用户的用户名密码从一个文件register中取出. register文件包含多个用户名,密码,用 ...

  6. Day9作业及默写

    1,整理函数相关知识点,写博客. 2,写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. def func(obj): return obj[1::2] 3, ...

  7. Day8作业及默写

    1,有如下文件,a1.txt,里面的内容为: 老男孩是最好的培训机构, 全心全意为学生服务, 只为学生未来,不为牟利. 我说的都是真的.哈哈 分别完成以下的功能: 将原文件全部读出来并打印. with ...

  8. Day7作业及默写

    1. 判断一个数是否是水仙花数, 水仙花数是一个三位数, 三位数的每一位的三次方的和还等于这个数. 那这个数就是一个水仙花数. 例如: 153 = 1**3 + 5**3 + 3**3 InputNu ...

  9. Day6作业及默写

    1.使⽤循环打印以下效果: 1: * ** *** **** ***** for num in range(1,6): print('*' * num) 2: ***** **** *** ** * ...

随机推荐

  1. MySQL共享表空间概念

    1.表空间概念 Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间.共享表空间以及独立表空间都是针对数据的存储方式而言的. 共享表空间 ...

  2. 利用JsonSchema校验json数据内容的合规性(转)

    原文地址:Json schema 背景: 复杂的AJAX应用程序可以与数百个不同的JSON服务进行交互,因此,引入对客户端验证的需求. 在处理校验问题方面有着很多的工具,但是通常可以将它们归为以下几类 ...

  3. [codechef July Challenge 2017] IPC Trainers

    IPCTRAIN: 训练营教练题目描述本次印度编程训练营(Indian Programming Camp,IPC)共请到了 N 名教练.训练营的日程安排有 M 天,每天最多上一节课.第 i 名教练在第 ...

  4. 水题系列一:Circle

    问题描述:Circle 小明在玩游戏,他正在玩一个套圈圈的游戏.他手里有 L 种固定半径的圆圈,每一种圆 圈都有其固定的数量.他要把这些圆圈套进 N 个圆形槽中的一个.这些圆形槽都有一个最 小半径和最 ...

  5. C++ leetcode Longest Palindromic Substring

    明天就要上课了,再过几天又要见班主任汇报项目进程了,什么都没做的我竟然有一种迷之淡定,大概是想体验一波熬夜修仙的快乐了.不管怎么说,每天还是要水一篇博文,写一个LeetCode的题才圆满. 题目:Gi ...

  6. ActiveMQ Message Groups

    http://activemq.apache.org/message-groups.html 与Exclusive Consumer相比,Message Groups的对消息分组的粒度更细.具有相同g ...

  7. ftp/sftp定时自动上传文件脚本(CentOS)

    1.ftp自动上传文件脚本 #!/bin/bash ftp -n<<! open 192.168.220.129 user ls toor binary hash cd /path/to/ ...

  8. jcmd

    1.jps 2.jcmd 1761[pid] PerfCounter.print 查看指定进程的性能统计信息 概述 在JDK1.7以后,新增了一个命令行工具 jcmd.他是一个多功能的工具,可以用它来 ...

  9. java中一对多 关联建表

    我们以银行卡为例:一个人可以对应多张银行卡.多个银行卡对应着一个人. /** 银行卡持有者 **/ class CardsOwner { private String name;    //名字 pr ...

  10. linux下文件内容查找 转

    find | xargs grep test find命令和xargs命令 网友:wuye_chinaunix 发布于: : (共有条评论) 查看评论 | 我要评论 青云 分配文件 - -| 回首页 ...