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()
# 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()
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()
# 基于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()
呵呵来点杂
# 基于类的反射
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__))