zoukankan      html  css  js  c++  java
  • 面向对象的上传

    服务端

    import socket
    import struct
    import json
    import subprocess
    import os

    class MYTCPServer:#server类
    address_family = socket.AF_INET

    socket_type = socket.SOCK_STREAM

    allow_reuse_address = False

    max_packet_size = 8192

    coding='utf-8'

    request_queue_size = 5

    server_dir='file_upload'

    def __init__(self, server_address, bind_and_activate=True):
    """Constructor. May be extended, do not override."""
    self.server_address=server_address
    self.socket = socket.socket(self.address_family,
    self.socket_type)
    if bind_and_activate:
    try:
    #绑定ip端口号
    self.server_bind()
    self.server_activate()
    except:
    self.server_close()
    raise

    def server_bind(self):
    """Called by constructor to bind the socket.
    """
    if self.allow_reuse_address:
    self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.socket.bind(self.server_address)
    #服务端获得客户端的ip和端口
    self.server_address = self.socket.getsockname()

    def server_activate(self):
    """Called by constructor to activate the server.
    """
    self.socket.listen(self.request_queue_size)

    def server_close(self):
    """Called to clean-up the server.
    """
    self.socket.close()

    def get_request(self):
    """Get the request and client address from the socket.
    """
    return self.socket.accept()

    def close_request(self, request):
    """Called to clean up an individual request."""
    request.close()

    def run(self):
    while True:
    self.conn,self.client_addr=self.get_request()#得到对象的conn和ip
    print('from client ',self.client_addr)
    while True:
    try:
    head_struct = self.conn.recv(4)#先接字典
    if not head_struct:break
    #字典有多少字节
    head_len = struct.unpack('i', head_struct)[0]
    head_json = self.conn.recv(head_len).decode(self.coding)
    head_dic = json.loads(head_json)
    print(head_dic)
    #head_dic={'cmd':'put','filename':'a.txt','filesize':123123}
    cmd=head_dic['cmd']
    if hasattr(self,cmd):
    func=getattr(self,cmd)
    func(head_dic)
    except Exception:
    break

    def put(self,args):
    #设置规范化下载路径
    file_path=os.path.normpath(os.path.join(
    self.server_dir,
    args['filename']
    ))

    filesize=args['filesize']
    recv_size=0
    print('----->',file_path)
    with open(file_path,'wb') as f:
    while recv_size < filesize:
    recv_data=self.conn.recv(self.max_packet_size)
    f.write(recv_data)
    recv_size+=len(recv_data)
    print('recvsize:%s filesize:%s' %(recv_size,filesize))


    tcpserver1=MYTCPServer(('127.0.0.1',8080))#生成server对象

    tcpserver1.run()#运行run方法




    客户端
    import socket
    import struct
    import json
    import os


    class MYTCPClient:#client类
    address_family = socket.AF_INET

    socket_type = socket.SOCK_STREAM

    allow_reuse_address = False

    max_packet_size = 8192

    coding='utf-8'

    request_queue_size = 5

    def __init__(self, server_address, connect=True):
    self.server_address=server_address
    self.socket = socket.socket(self.address_family,
    self.socket_type)
    if connect:
    try:
    self.client_connect()
    except:
    self.client_close()
    raise

    def client_connect(self):
    self.socket.connect(self.server_address)

    def client_close(self):
    self.socket.close()

    def run(self):
    while True:
    inp=input(">>: ").strip()
    if not inp:continue
    l=inp.split()#方法|文件名
    cmd=l[0]
    if hasattr(self,cmd):
    func=getattr(self,cmd)
    func(l)#执行操作上传下载


    def put(self,args):
    cmd=args[0]
    filename=args[1]
    if not os.path.isfile(filename):
    print('file:%s is not exists' %filename)
    return
    else:
    filesize=os.path.getsize(filename)
    #方法名文件名文件大小
    head_dic={'cmd':cmd,'filename':os.path.basename(filename),'filesize':filesize}
    print(head_dic)
    head_json=json.dumps(head_dic)
    #把字典变成字节
    head_json_bytes=bytes(head_json,encoding=self.coding)
    #先发送字典的字节数
    head_struct=struct.pack('i',len(head_json_bytes))
    self.socket.send(head_struct)
    self.socket.send(head_json_bytes)
    send_size=0
    with open(filename,'rb') as f:
    for line in f:
    self.socket.send(line)
    send_size+=len(line)
    print(send_size)
    else:
    print('upload successful')

    client=MYTCPClient(('127.0.0.1',8080))

    client.run()


  • 相关阅读:
    使用FileReader在浏览器读取预览文件(image和txt)
    移动端Vue图片获取,压缩,预览组件-upload-img(H5+获取照片,压缩,预览)
    文件(图片)转base64
    Vue单页面应用打包app处理返回按钮
    hbuilder/hbuilderx 无法检测到模拟器
    不启动AndroidStudio直接启动其模拟器
    ES6,箭头函数 (=>)注意点
    ES6,扩展运算符
    strcmp使用注意
    android11 gc5035前置摄像头当作后置使用左右镜像问题
  • 原文地址:https://www.cnblogs.com/huhuxixi/p/10418678.html
Copyright © 2011-2022 走看看