zoukankan      html  css  js  c++  java
  • 简单的支持并发服务端(上传功能)

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

    ** 需要了解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)
      
  • 相关阅读:
    推荐一款稳定快速免费的前端开源项目 CDN 加速服务
    MySQL限时解答
    OneProxy的功能与限制
    MySQL浮点计算存在的问题与解决方案
    DAS、SAN、NAS的区别
    气质
    受制于人
    mysqlbinlog flashback 5.6完全使用手册与原理
    Innodb引擎 compact模式下元组的磁盘存储结构
    数据迁移程序
  • 原文地址:https://www.cnblogs.com/demiao/p/11493632.html
Copyright © 2011-2022 走看看