网络编程:基于tcp的ftp的单线程和多线程

ftp的单线程

# upload and download       client.py



import socket
import struct
import json
import os



class MYTCPClient:
    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()
client
# upload and download       server.py

import socket
import struct
import json
import subprocess
import os

class MYTCPServer:
    address_family = socket.AF_INET

    socket_type = socket.SOCK_STREAM

    allow_reuse_address = True

    max_packet_size = 8192

    coding='utf-8'

    request_queue_size = 5

    #上传文件地址
    server_dir='/Users/Alex/desktop/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):
        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)
                    #head_dic={'cmd':'put','filename':'a.txt','filesize':123123}
                    cmd=head_dic['cmd']
                    if hasattr(self,cmd):  #hasattr(本客户端类实例化对象对象,put命令)
                        func=getattr(self,cmd) #返回一般属性的值,返回函数的名字,加括号即运行
                        func(head_dic)  #等价于put(传入字典的参数)
                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',9002))

tcpserver1.run()
server

 

 

ftp的多线程

# 基于tcp的ftp多线程上传客户端,好多个一样的客户端


# 操作指南:
# 运行服务端
# 运行各个客户端
# 每个客户端里输入命令,
# 例如:
# put /users/alex/desktop/hello.mp4
# put /users/alex/desktop/hello1.mp4
# put /users/alex/desktop/hello2.mp4
# ⚠注意设定服务器端上传文件夹的地址,要新建文件夹,如有绝对地址则以绝对地址为主


import socket
import struct
import json
import os



class MYTCPClient:
    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',8082))

client.run()
client
# 基于tcp的ftp多线程上传服务端

import socketserver
import struct
import json
import subprocess
import os

class MYTCPServer(socketserver.BaseRequestHandler):

    max_packet_size = 8192

    coding='utf-8'
    BASE_DIR=os.path.dirname(os.path.abspath(__file__))

    server_dir='file_upload'

    def handle(self):
        while True:
            try:
                head_struct = self.request.recv(4)
                if not head_struct:break

                head_len = struct.unpack('i', head_struct)[0]
                head_json = self.request.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.BASE_DIR,
            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.request.recv(self.max_packet_size)
                f.write(recv_data)
                recv_size+=len(recv_data)
                print('recvsize:%s filesize:%s' %(recv_size,filesize))




if __name__ == '__main__':
    obj=socketserver.ThreadingTCPServer(('127.0.0.1',8082),MYTCPServer)
    obj.serve_forever()
server

 

呵呵来点杂

# 基于类的反射
class People:
    country="china"
    def __init__(self,name):
        self.name=name

    def walk(self):
        print("%s walk",self.name)

h=People("ada")
# 利用布尔值返回类或对象有没有这个属性
print(hasattr(People,"country"))
print(hasattr(h,"country"))
print(hasattr(h,"walk"))

#获取类或对象的某个属性
res1=getattr(People,"country")
print(res1)
res2=getattr(h,"country")
print(res2)
res3=getattr(h,"walk")
print(res3)
# 直接运行而不要前面加对象或者实例
print(res3())

#设置类或对象的某个属性并查看
setattr(h,"age",18)
print(h.__dict__)

#删除类或对象的某个属性并查看
delattr(h,"age")
print(h.__dict__)

import os
# 拼接文件夹和文件,第一个参数是文件夹名,第二个是文件名
print("join:      ",os.path.join('file_upload','a.txt'))

# 返回绝对路径,注意不是相对路径
print("abspath:    ",os.path.abspath("xxx.txt"))

# 返回文件目录和文件名二元组
print("split:      ",os.path.split('/users/alex/hello.txt'))

# 规范化windows路径
file_path=os.path.normpath(os.path.join('file_upload','a.txt'))
print("nrompath:    ",file_path)

# 返回path最后的文件名
print("basename:     ",os.path.basename('/users/test.csv'))

# 文件所在的完整目录
print("dirname:      ",os.path.dirname(__file__))

  

posted @ 2017-09-20 16:35  Adamanter  阅读(479)  评论(0编辑  收藏  举报