资源简介

此代码基于python实现了服务器/客户端的断点续传,可以作为网络编程中的参考。

资源截图

代码片段和文件信息

#!/usr/bin/env python 
#   --coding = utf-8 
#   Author Allen Lee 
import socket os json sys
import struct
import time
import sys

class Myclient():
    # 在构造方法中启动client的socket对象以及连接server端
    def __init__(self):
        self.client = socket.socket()
        self.client.connect((‘127.0.0.1‘ 9909))

    # main为client的主方法,其中通过对用户输入的命令来判断具体操作,并通过反射将其引导到对应的方法
    # !/usr/bin/python3



    def clear(self):
         os.system(‘cls‘)
    def main(self):
        while True:
            res_data = self.client.recv(1024).strip()
            if not res_data:
                break
            print(str(res_data encoding=‘utf-8‘))
            print(‘请输入命令 put:发送文件\n‘)
            send_data = input(‘>>: ‘).strip()
            if not send_data:
                continue
            if hasattr(self send_data):
                getattr(self send_data)(send_data)
            else:
                self.client.close()
            # 当用户输入的不是指定的put方法时,退出


    
    def put(self send_data):
        pathh = input(‘Input the file’s path :‘)
        # 首先判断文件是否存在,通过os.path.isfile来实现
        ret = os.path.isfile(pathh)

        if not ret:
            print(‘The file is not exist‘)
            return False
        # 如果存在,则将操作类型、文件名、文件大小以字典形势格式化,再以json的方法进行格式化
        else:
            # 通过os.stat方法来取文件的大小
            file_size = os.stat(pathh).st_size
            file_name = os.path.basename(pathh)
            self.client.send(bytes(send_dataencoding=‘utf-8‘))
            time.sleep(1)
            print(send_data)
            print(file_name)
            self.client.send(bytes(file_name encoding=‘utf-8‘))
            time.sleep(1)
            print(file_size)
            self.client.send(str(file_size).encode(‘utf-8‘))
            res_tag = str(self.client.recv(1024).decode(‘utf-8‘))
            print(res_tag)   ####打印接受的ok或continue
            if not res_tag:
                return False
            if res_tag.startswith(‘ok‘):
                # 上传文件只用r就够了
                with open(pathh ‘rb‘) as f:
                    new_size = 0
                    scale = file_size//1024
                    while True:
                        try:
                            for i in range(scale + 1):
                                filedata = f.read(1024)
                                # print(filedata)
                                new_size += len(filedata)
                                if not filedata:
                                    break
                                self.client.send(filedata)
                                self.progres(new_size file_size)
                                time.sleep(0.1)
                        except KeyboardInterrupt:
                            self.client.close()
            if res_tag.startswith(‘continue‘):
                with open(pathh ‘rb+‘) as f:
                    # 此处使用seek来进行文件指针的偏移,进而完成断点续传的功能
                    sendd_data 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        5716  2018-11-18 19:55  c_f.py
     文件        3580  2018-11-18 19:55  s_f.py

评论

共有 条评论