python网络编程

程序的目录结构

socketDemo
├── client
│   ├── cli.py
│   └── local_dir
│       └── lianxijiangjie.mp4
└── server
    ├── download
    │   └── lianxijiangjie.mp4
    └── ser.py

 

ser.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'mosson'
import socket
import struct
import json
import os

base_dir = os.path.dirname(os.path.abspath(__file__))
base_dir = os.path.join(base_dir, 'download')


class MYTCPServer:
    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:
                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)
        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):
        print('server is running .......')
        while True:
            self.conn,self.client_addr=self.get_request()
            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)
                    cmd=head_dic['cmd']
                    if hasattr(self,cmd):
                        func=getattr(self,cmd)
                        func(head_dic)
                except Exception:
                    break

    def put(self,args):
        """
        文件长传
        :param args:
        :return:
        """
        file_path=os.path.normpath(os.path.join(
            base_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(2048)
                f.write(recv_data)
                recv_size += len(recv_data)
            else:
                print('recvsize:%s filesize:%s' %(recv_size,filesize))

    def get(self, args):
        """ 下载文件
        1 检测服务端文件是不是存在
        2 文件信息 打包发到客户端
        3 发送文件
        """
        filename = args['filename']
        dic = {}
        if os.path.isfile(base_dir + '/' + filename):
            dic['filesize'] = os.path.getsize(base_dir + '/' + filename)
            dic['isfile'] = True
        else:
            dic['isfile'] = False
        str_dic = json.dumps(dic) # 字典转str
        bdic = str_dic.encode(self.coding) # str转bytes
        dic_len = len(bdic) # 计算bytes的长度
        bytes_len = struct.pack('i', dic_len) # 
        self.conn.send(bytes_len) # 发送长度
        self.conn.send(bdic)  # 发送字典
        # 文件存在发送真实文件
        if dic['isfile']:
            with open(base_dir + '/' + filename, 'rb') as f:
                while dic['filesize'] > 2048:
                    content = f.read(2048)
                    self.conn.send(content)
                    dic['filesize'] -= len(content)
                else:
                    content = f.read(2048)
                    self.conn.send(content)
                    dic['filesize'] -= len(content)
            print('下载完成')


tcpserver1=MYTCPServer(('127.0.0.1',8083))

tcpserver1.run()
服务端代码

相关文章:

  • 2022-12-23
  • 2021-08-31
  • 2021-05-18
  • 2022-12-23
  • 2018-11-25
  • 2021-12-12
  • 2021-06-23
猜你喜欢
  • 2021-09-19
  • 2021-09-19
  • 2021-09-19
  • 2021-11-04
  • 2022-12-23
  • 2021-09-19
相关资源
相似解决方案