Python día de estudio 39 (ftp ejercicios para lograr día 1)

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

Supongo que te gusta

Origin www.cnblogs.com/xiaoyaotx/p/12617073.html
Recomendado
Clasificación