Los próximos tres días o cuatro días o cinco días también, voy a empezar a poner en práctica un proceso de registro de FTP, de hecho, el disco función de red Baidu algo similar, llevado a cabo una implementación preliminar:
Los requisitos principales:
La clave es hacer algo de la lógica principal, llevado a cabo para verificar los pasos de contraseña:
directorio de archivos de la siguiente manera:
introducir principalmente documento del lado del servidor que,
archivo bin Europea puerto
archivo de configuración conf (que contiene la información de puerto, la información del usuario)
archivo maestro lógica de la base (operación lógica primaria)
archivo de registro de operación del registrador
Es todavía etapa relativamente áspera.
En primer lugar introducir el lado del servicio del código principal:
bin: ftp_server.py
importación OS, sys BASE_DIR = os.path.dirname (os.path.dirname (os.path.abspath ( __file__ ))) sys.path.append (BASE_DIR) de núcleo importación principal Si __name__ == ' __main__ ' : main.ArgvHandler ()
archivo del núcleo: main.py
importación socketserver importación optparse de conf importación configuración de núcleo de importación del servidor clase ArgvHandler (): def __init__ (self): self.op = optparse.OptionParser () # self.op.add_option ( '- S', '- Servidor', 'servidor' dest =) # self.op.add_option ( '- P', '- P' , dest = 'Puerto') # módulo de análisis, provisionalmente no utilizado a, es argv parámetros de entrada para venir en forma de pares de valores clave para salvar, imprima como un diccionario, pero no es un diccionario, por. manera de llamar a Opciones, args = self.op .parse_args () # Se supone que los parámetros de entrada iniciales para el funcionamiento de 127.0.0.1 -p -s 8080 # impresión (Opciones) {# 'Servidor': '127.0.0.1', 'Port': 8080} # impresión (tipo (Opciones)) # opciones de tipos de datos son objeto de instancia optparse # impresión (args) # no hay parámetros para la posterior recepción de esos identificadores que tienen el prefijo self.verify_args (opciones, args) def verify_args (auto, opciones, args): cmd = args [0] si hasattr (self, cmd): func = getattr (self, cmd) func () def empezar (self): print ( ' ========== ========== bienvenida servidor_ftp ' ) s = socketserver.ThreadingTCPServer ((settings.IP, settings.PORT), server.ServerHandler) s.serve_forever ()
archivo del núcleo: server.py
importación socketserver importación JSON clase ServerHandler (socketserver.BaseRequestHandler): def mango (auto): mientras Verdadero: datos = self.request.recv (1024 ) .strip () datos = json.loads (data.decode ( ' utf-8 ' )) ''' { 'Acción': 'auth', 'Nombre de usuario': 'xiao', 'Contraseña': 123 ''' Si data.get ( ' acción ' ): Si hasattr (auto, data.get ( ' acción ' )): func = getattr (self, data.get ( ' acción ' )) func ( ** datos) otra cosa : print ( ' error func ' ) self.request.send ( ' error func ' .encode ( ' UTF-8 ' )) otra cosa : print ( ' no válida cmd ' ) self.request.send ( ' no válida cmd ' .encode ( ' utf-8 ' )) def autenticación (auto, ** datos): de impresión (datos) def puesto (sí, ** datos): pase
conf: settings.py
IP = ' 127.0.0.1 ' PORT = 8080
Sobre servidor es actualmente mucho, pero una gran cantidad de características aún sólo un paso, y mucho tiempo los fines de semana y luego uno por uno archivo lógico escrito, a pesar de que ya está terminado, pero no mantener su mente todavía en un estado de
Aquí está el contenido del cliente, en la actualidad dado cuenta de verificar la información introducida dirección IP, información del puerto
Al mismo tiempo interactuando nombre de usuario y contraseña de autenticación con el servidor
El cliente (ftp_client):
Importación zócalo de importación El optparse importación ConfigParser importación JSON # tcp_client = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # tcp_client.connect (( '127.0.0.1', 8080)) # tcp_client.send ( 'ok'.encode (' .-8 UTF ')) # anterior es el modo fácil clase ClientHandler (): def __init__ (auto): self.op = optparse.OptionParser () self.op.add_option ( ' -s ' , ' --server ' , dest = ' servidor ' ) self.op.add_option ( ' -P ' , ' --port ' , dest = ' puerto ' ) self.op.add_option ( ' -u ' , ' --username ' , dest = ' nombre de usuario ' ) self.op.add_option ( ' -p ' , ' --password ' , dest = ' contraseña ' ) self.options, self.args = self.op.parse_args () self.verify_args (self.options, self.args) self.make_connection () DEF verify_args (Self, Opciones, args): # del puerto de puerto verificar Servidor = options.server puerto = options.port # nombre de usuario = options.username # password = options.password si int (puerto) <0 y int (puerto)> 65535 : retorno verdadera cosa : salida ( ' el puerto está en 0 ~ 65535 ' ) def make_connection (self): self.sock = socket.socket, (socket.AF_INET, socket.SOCK_STREAM), self.sock.connect (self.options.server, int (self.options.port)) def interractive (self): self.authenticate () def authenticate (auto): si self.options.username es Ninguno o self.options.password es Ninguno: nombre de usuario = input ( ' nombre de usuario >>> ' ) password = input ( ' contraseña >>> ' ) de retorno get_auth_result (nombre de usuario, contraseña) otra cosa : el retorno get_auth_reult (self.options.username, self.options.password) def respuesta (self): datos = self.sock.recv (1024) .decode ( ' utf-8 ' ) datos = json.loads (datos) de retorno de datos def get_auth_result (self, usuario, pwd): datos = { ' acción ' : ' auth ' , ' nombre de usuario ' : usuario, ' contraseña ' : pwd } self.sock.send (json.dumps (datos) .encode ( ' utf-8 ' )) respuesta = self.response () de impresión (respuesta) ch = ClientHandler () ch.interractive ()
Hoy en día, el nombre de usuario necesidad de verificación para repasar módulo de información configpraser, como el foco de la dirección de mañana en este momento cliente de autenticación de contraseña no es un problema, el servidor no puede alcanzar
Continuará mañana, dormí.
Casi lo olvido, hoy también aprender un módulo optparse para el procesamiento de la información de entrada en el modo de argv, por lo que es modular, los módulos tienen que ver un mañana detallada, esto en realidad el sueño