简单的支持并发服务端(上传功能)

简单的支持并发服务端(上传功能)

** 需要了解socketserver模块**

  • 服务端

    import socketserver
    import struct
    import os
    from conf import settings
    
    #自己定义一个类,必须继承BaseRequestHandler
    class MyTcp(socketserver.BaseRequestHandler):
        #必须重写handle方法
        def handle(self):
            try:
                while True :  #通信循环
    
                    # 获取头的内容
                    dic_len_byte = self.request.recv(4)
                    if len(dic_len_byte)==0:
                        return
                    print('有客户端连接进来了,地址如下', self.client_address)
                    print(self)
                    print(dic_len_byte)
                    #获取dic长度
                    dic_len = struct.unpack('i', dic_len_byte)[0]
                    print(dic_len)
                    dic_head = eval(self.request.recv(dic_len))
                    # 获取文件字节数和文件名
                    data = self.request.recv(dic_head['size'])
                    data_name = dic_head['name']
                    # print(data.decode('utf8'))
                    cloud_file_path = os.path.join(settings.cloud_db_path, data_name)
                    with open(cloud_file_path, 'wb') as fw:
                        fw.write(data)
    
            except Exception:
                pass
    
    
    if __name__ == '__main__':
        #实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
        #第一个参数是绑定的地址,第二个参数传一个类
        server=socketserver.ThreadingTCPServer(('127.0.0.1',8081),MyTcp)
        #一直在监听
        #这么理解:只要来一个请求,就起一个线程(造一个人,做交互)
        server.serve_forever()
    
    
  • 客户端

        while True:
            file_path=input('请输入文件路径按q退出>>>')
            if file_path=='q':
                break
            # print(os.path.getsize(file_path))
            file_name=file_path.split('\\')[-1]
            data_head={'size':os.path.getsize(file_path),'name':file_name}
            data_head_s=json.dumps(data_head)
            data_head_bytes=data_head_s.encode('utf8')
            # print(data_head_bytes)
            #把头的长度以长度为4的字节发送过去
            head_len_bytes=struct.pack('i',len(data_head_bytes))
            client.send(head_len_bytes)
            client.send(data_head_bytes)
            print('正在上传',file_name)
            with open(file_path,'rb') as fr:
                data=fr.read()
            client.send(data)
            print('上传成功',file_name)
    
posted @ 2019-09-09 19:12  得淼  阅读(417)  评论(0编辑  收藏  举报