python学习笔记——捌 ScoketServer

服务端:

import socketserverimport json,osimport hashlibclass MyTCPHandler(socketserver.BaseRequestHandler):

def put(self,*args):        server_md5=hashlib.md5()        ‘‘‘接收客户端文件‘‘‘        cmd_dic = args[0]        filename = cmd_dic["filename"]        filesize = cmd_dic["size"]        if os.path.isfile(filename):            f = open(filename + ".new","wb")        else:            f = open(filename , "wb")

self.request.send(b"200 ok")        received_size = 0        while received_size < filesize:            data = self.request.recv(1024)            server_md5.update(data)            f.write(data)            received_size += len(data)

else:            print("file [%s] has uploaded..." % filename)

self.request.send(server_md5.hexdigest().encode())

def get(self,*args):        md5_server=hashlib.md5()        #接收客户端的信息        cmd_dic=args[0]        #得到文件名称        filename=cmd_dic["filename"]        #判断是不是个文件        if os.path.isfile(filename):            #得到文件大小            file_size=os.stat(filename).st_size            #j将文件大小发送给客户端            self.request.send(str(file_size).encode())            #对应客户端的胡写,防止粘包            self.request.recv(1024)            #开始发送文件了            f=open(filename,"rb")            for line in f :                self.request.send(line)                md5_server.update(line)            #将MD5后的值 发送给客户端            print(md5_server.hexdigest())            self.request.send((md5_server.hexdigest()).encode())        else:            print("服务端没有此文件")

def handle(self):

while True:            try:                self.data = self.request.recv(1024).strip()                print("{} wrote:".format(self.client_address[0]))                print(self.data)                cmd_dic = json.loads(self.data.decode())                action = cmd_dic["action"]                if hasattr(self,action):                    func = getattr(self,action)                    func(cmd_dic)

except ConnectionResetError as e:                print("err",e)                break

if __name__ == "__main__":    HOST, PORT = "localhost", 9997    # Create the server, binding to localhost on port 9999    server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler)    server.serve_forever()

客户端
_author__ = "Alex Li"import socketimport jsonimport osimport hashlib#用于打印进度条import sys,time

# client.connect((‘192.168.16.200‘,9999))

class FtpClient(object):    def __init__(self):        self.client = socket.socket()

def help(self):        msg = ‘‘‘        ls        pwd        cd ../..        get filename        put filename        ‘‘‘        print(msg)

def connect(self, ip, port):        self.client.connect((ip, port))    #利用反射,通过输入的字符串 来调用不同的方法    def interactive(self):        md5_client=hashlib.md5()        # self.authenticate()

#执行操作的代码        while True:            cmd = input(">>").strip()            if len(cmd) == 0: continue            cmd_str = cmd.split()[0]            if hasattr(self, "cmd_%s" % cmd_str):                func = getattr(self, "cmd_%s" % cmd_str)                func(cmd)            else:                self.help()

def cmd_put(self, *args):        cmd_split = args[0].split()        if len(cmd_split) > 1:            filename = cmd_split[1]            if os.path.isfile(filename):                filesize = os.stat(filename).st_size                msg_dic = {                    "action": "put",                    "filename": filename,                    "size": filesize,                    "overridden": True                }                self.client.send(json.dumps(msg_dic).encode("utf-8"))                print("send", json.dumps(msg_dic).encode("utf-8"))                # 防止粘包,等服务器确认                server_response = self.client.recv(1024)                f = open(filename, "rb")                #用于MD5校验                client_md5=hashlib.md5()                #用于计算发送了多少数据                clien_size=0                b=0                for line in f:                    self.client.send(line)                    client_md5.update(line)                    clien_size +=len(line)

# 计算接收的数据 占 总文件的百分比                    a = int(clien_size / filesize * 100)                    if b != a and a % 2 == 0:                        # print("%d" % a + "%")                        sys.stdout.write("#")                        sys.stdout.flush()                    else:                        pass                    b = a                else:                    print("100%")                    f.close()                 #客户端发送数据的md5值                client_md5=client_md5.hexdigest()

else:                print(filename, "is not exist")

server_ma5=self.client.recv(1024)            server_ma5=server_ma5.decode()            #判断 两边的md5值是否是一致的            if server_ma5==client_md5:                print("文件成功上传至服务器")            else:                print("上传出错")

def cmd_get(self, *args):        # 用md5对比文件是否一致        md5_clent = hashlib.md5()        ‘‘‘此方法用于下载操作‘‘‘        # 把输入的命令 按空格分隔 切分成列表        cmd_split = args[0].split()        # 如果命令的长度大于0        if len(cmd_split) > 1:            # 得到文件名            filename = cmd_split[1]            # 服务端那边解析的是一个字典,所以我也写个字典

msg_dic = {                "action": "get",                "filename": filename            }            print(msg_dic)            # 将动作和文件名发给服务端            self.client.send(json.dumps(msg_dic).encode("utf-8"))            print("发送完毕")

# 获得服务端文件的大小            size = self.client.recv(1024).decode()            print(type(size))            print(size)            server_size = int(size)            print("获得服务器文件的大小是%s" % server_size)            # 胡写一个,防止粘包            self.client.send(b"jiehsou wenjian")            # 准备接受 服务端发来的数据            # 已经获取文件的大小            clien_size = 0            if os.path.isfile(filename):                f = open(filename + "new", "wb")            else:                f = open(filename, "wb")            #防止重复出现相同的百分比 而设置的变量            b=0            while clien_size < server_size:                if server_size - clien_size > 1024:                    data_size = 1024                else:                    data_size = server_size - clien_size

data=self.client.recv(data_size)                md5_clent.update(data)                f.write(data)                #计算接收过来的数据长度                clien_size += len(data)

#计算接收的数据 占 总文件的百分比                a=int(clien_size/server_size*100)                if b!=a  and a%2==0:                    # print("%d" % a + "%")                    sys.stdout.write("#")                    sys.stdout.flush()                else:                    pass                b=a

# 接收server过来的md5值        server_md51 = self.client.recv(1024)        server_md52 = server_md51.decode()        clien_md5= md5_clent.hexdigest()        # print("md5_server1--%s" % server_md51)        # print("md5_server2--%s" % server_md52)        #        # print("md5_client--%s" % clien_md5)        # print(server_md51==clien_md5)        # print(server_md52==clien_md5)        if server_md52==clien_md5 :            print("100%")        else:            print("文件可能被篡改,请重新下载")

ftp = FtpClient()ftp.connect("localhost", 9997)ftp.interactive()
				
时间: 2024-10-10 22:32:55

python学习笔记——捌 ScoketServer的相关文章

Python学习笔记捌——面向对象高级编程

__slots__特殊变量的使用: 由于Python是动态语言,允许先编写类,然后在创建实例的时候添加属性或者方法:而__slots__特殊变量就是,限制往类里添加属性的: 在创建类的时候,使用__slots__ =('name','age'),就是在创建实例时候,只允许添加绑定name和age两个属性:注意!__slots__只对当前类有效,不会作用于子类: @property装饰器:为了实现数据的封装,不把属性暴露在外面,所以如果想访问实例内部属性的话,就需要使用get和set方法,但是这样

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho

python学习笔记12-模块使用

python学习笔记12-模块使用 模块os,sys 什么是模块? 模块os,sys 模块是Python组织代码的一种基本方式 一个Python脚本可以单独运行,也可以导入到另外一个脚本运行,用import hello语句来导入,不用加入.py 什么是Python的 包? Python的模块可以按照目录组织为包 创建一个包的步骤: 创建一个名字为包名的目录 在改目录下创建一个__init__.py文件 根据需要,在该目录下存放脚本文件或已编译的扩展及子包 import pack.m1,pack.

python学习笔记2—python文件类型、变量、数值、字符串、元组、列表、字典

python学习笔记2--python文件类型.变量.数值.字符串.元组.列表.字典 一.Python文件类型 1.源代码 python源代码文件以.py为扩展名,由pyton程序解释,不需要编译 [[email protected] day01]# vim 1.py #!/usr/bin/python        print 'hello world!' [[email protected] day01]# python 1.py hello world! 2.字节代码 Python源码文件

Python学习笔记--未经排版

Python 学习笔记 Python中如何做到Print() 不换行 答:Print("输出内容",end='不换行的分隔内容'),其中end=后面为2个单引号 注:在Python 2.x中,Print "输出内容", 即在输出内容后加一逗号 Python中 is 和 == 的区别 答:Python中的对象包含三要素:id.type.value 其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值 is判断的是a对象是否就是b对象,是通过id来

Python学习笔记_Python对象

Python学习笔记_Python对象 Python对象 标准类型 其他内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比较 对象身份比较 布尔类型 标准类型的内建函数 typeObj cmpobj1 obj2 strobj reprobj typeobj isinstanceobj 标准类型的分类 存储模型 更新模型 访问模型 不支持的类型 Python学习笔记_Python对象 首先来理解一个通俗的含义,什么是对象?其实对象无论在什么语言里面

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd

python 学习笔记 14 -- 常用的时间模块之datetime

书接上文,前面我们讲到<常用的时间模块之time>,这次我们学习datetime -- 日期和时间值管理模块 使用apihelper 查看datetime 模块,我们可以看到简单的几项: date       ---  日期对象,结构为date(year, month, day) time       ---  时间值对象,结构为 time([hour[, minute[, second[, microsecond[, tzinfo]]]]]).时间对象所有的参数都是可选的.tzinfo 可以

python 学习笔记 6 -- 异常处理

当你的程序中出现某些 异常的 状况的时候,异常就发生了.例如,当你想要读某个文件的时候,而那个文件不存在.或者在程序运行的时候,你不小心把它删除了. 那么如果你是在IDE中运行,一个错误发生,异常会被打引出来,这便是未处理异常:当异常发生时,如果没有代码去关注和处理它,这些异常会传给置在Python中的缺省处理,他会输出一些调试信息并且终止运行.如果是在IDE中,这不是什么大事,但是如果是Python程序运行中的异常,它会导致整个程序终止,对于这些情况可以使用异常来处理. 1.try..exce