今天的主要内容为,文件上传的功能,与上传一致性(一致性校验),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 hashlib
s='a'
a=hashlib.md5()
a.update(s.encode('utf8'))#在for里写这个 把变量全部叠加完  
p=a.hexdigest()   #在这里再统一打印一下该文件的密文,
print(p)

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

import socketserver,struct,os

class 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自己写也没怎么,所以索性都倍吧