博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
py 的 第 29 天
阅读量:7036 次
发布时间:2019-06-28

本文共 2597 字,大约阅读时间需要 8 分钟。

今天的主要内容为,文件上传的功能,与上传一致性(一致性校验),socketserve功能,以及看了一下socketserve源码

首先我们讲解一下文件上传的功能,

引入 import socket 模块以及ip 地址 到acpet都不写了今天讲的稍稍复杂一点因为要传送的时候,例如建立一个文件夹再传送,所以我们需要字典,里面加入一些例如名字,长度,操作方法客户端传送的时候,要面对一个把字典转成字符的过程,这里引入 json模块while 1:    cmd = input("enter a commend:")  # put 111.png    action,filename = cmd.strip().split(" ")    filesize = os.path.getsize(filename)     #获取文件的大小    #上传文件信息    file_info = {        "action":action,        "filename":filename,        "filesize":filesize    }    file_info_json = json.dumps(file_info)  #把字典转成字符串    dic_len = len(file_info_json)           #得到字典的长度    compress = struct.pack("i",dic_len)        #压包    sk.send(compress)                          #第一次发送 把压缩包发送给服务器    file_info_json = json.dumps(file_info).encode("utf-8") #把字典转换成字符串形式, 再转换成字节形式    sk.send(file_info_json)   #把序列化后的 字节形式的 字典发给服务器    #发送文件数据    with open(filename,"rb") as f:        for line in f:            sk.send(line) #rb 的模式读出来的 不用再编码了    print("上传成功")服务端接收也是同理while 1:    print("服务器准备连接")    conn,addr = sk.accept()   #服务器不关    while 1:        header_pack = conn.recv(4)                   #接收压缩的报头        dic_len = struct.unpack("i",header_pack)[0]  #得到的是一个元组,取出数值,得到字典的长度        # print(dic_len)        data = conn.recv(dic_len).decode("utf-8")    #用得到的字典的字节长度值,接收下一次传来的序列化的字典        file_info = json.loads(data)                 #把接受到的字符串 转换成字典        print("file_info:",file_info)                #得到字典        action = file_info.get("action")        filename = file_info.get("filename")        filesize = file_info.get("filesize")        #接收数据        with open("filename222pic.png","wb") as f:  #要写出来文件格式            recv_data_length = 0            while recv_data_length < filesize:                data = conn.recv(1024) #字节串                recv_data_length += len(data)                f.write(data)                print("已经上传文件大小:",recv_data_length, "文件大小:",filesize)        print("上传成功")

 上传一致性的校验:

每次上传或下载的时候,都加密一次这个文件 用for 循环每一行字节加密一行   然后在for 外面 写他的加密请看下一段代码,读取的时候同理

import hashlibs='a'a=hashlib.md5()a.update(s.encode('utf8'))#在for里写这个 把变量全部叠加完  p=a.hexdigest()   #在这里再统一打印一下该文件的密文,print(p)

 socketserve模块,目前来讲写这个固定格式吧,     以及后面看源码,目前自我感觉良好,只是老师讲的快?

import socketserver,struct,osclass myserver(socketserver.BaseRequestHandler):    def handle(self):    pass    不过以后需要注意的是 接收文件不再是 conn.recv 是self.request.recv()                                            传送文件也换成 self.request.recv()server=socketserver.ThreadingTCPServer(('192.168.13.252',8899),myserver)server.serve_forever()这里除了 myserver是自己定义的变量,ip地址,端口自己写的,其他都固定的 且myserve自己写也没怎么,所以索性都倍吧

 

转载于:https://www.cnblogs.com/Mrszhao/p/9600822.html

你可能感兴趣的文章
JAVA & JSON详解
查看>>
C#编程总结(八)数字签名
查看>>
Mac显示隐藏文件的终端命令
查看>>
Spring MVC controller间跳转 重定向 传参 (转)
查看>>
再破博客园登录
查看>>
Entity Framework在WCF中序列化的问题
查看>>
OpenCL快速入门
查看>>
选择生成日报表,月报表,年报表
查看>>
使用位操作
查看>>
Babelfish(二分)
查看>>
JS 中如何判断 undefined 和 null
查看>>
ftk学习记录(一个进度条文章)
查看>>
log4j直接输出日志到flume
查看>>
非正确使用浮点数据由项目产生BUG讨论的问题
查看>>
PHP5中的stdClass
查看>>
IntelliJ IDEA Community Edition 14.1.4下使用 Apache-Subversion搭建代码管理环境
查看>>
四种可变交流swap方法
查看>>
Lucene中的 Query对象
查看>>
二分基础
查看>>
物流英语
查看>>