Diagrama de configuración básica:
Aquí está el diagrama de configuración básico para ejecutar este programa.
Para simplificar, llamaremos al Sistema A como A_client y al Sistema B como B_server a lo largo del artículo.
Requisitos de archivo:
Nosotros necesitamos servidor.py y este archivo debe estar presente en el sistema del servidor. En nuestro caso servidor.py debería estar en el sistema B_server.
Otros dos archivos cliente.py y muestra.TXT debe estar presente en el sistema del cliente. En nuestro caso, esos dos archivos deberían estar presentes en el sistema A_client.
Supuestos:
Aquí están las suposiciones:
- Deberíamos tener dos sistemas Linux con acceso a la terminal.
- El sabor de Linux preferible es Ubuntu.
- Python3 debería estar instalado.
- Ambos sistemas Linux deberían poder hacer ping entre sí. Usar silbido
comando para verificar ping. - Un sistema debe actuar como servidor y otro sistema debe actuar como cliente en un momento determinado.
Limitaciones:
Antes de continuar, debemos saber que existen algunas limitaciones de este programa.
- Python3 + debe estar instalado para ejecutar este programa. Puede observar un error o un comportamiento diferente si se ejecuta en versiones anteriores de Python.
- Solo el archivo de texto se puede transferir a través de este programa a partir de ahora. Cualquier otro archivo de formato que no contenga texto puede fallar.
- Las excepciones básicas de programación se han manejado en el programa.
- El programa puede o no ejecutarse en otro sistema operativo que no sea Ubuntu.
- El archivo de texto debe ser corto en el lado del cliente, ya que se ha utilizado un tamaño de búfer de 1024 bytes.
Configurar requisitos:
- Necesitamos al menos un sistema Linux para probar este programa. Pero la recomendación es utilizar dos sistemas Linux diferentes que estén conectados a través de la red.
- Dos sistemas deben estar conectados a través de Ethernet o Wi-Fi o cualquier otra conexión.
Código fuente del servidor:
https: // github.com / linuxhintcode / websamples / blob / master / python_send_file / server.py
Código fuente del cliente:
https: // github.com / linuxhintcode / websamples / blob / master / python_send_file / client.py
Cómo ejecutar programas y resultados esperados:
Estos son los pasos para ejecutar el programa.
Paso 1: Vaya al sistema B_server y abra una terminal. El atajo para abrir una terminal es Alt + Ctrl + t.
Paso 2: ahora ve a la ruta donde el servidor.py está presente.
Paso 3: ahora ejecuta el servidor.py como a continuación
servidor python3.pyNo debería haber ningún error y debería ver las impresiones a continuación
El servidor aparece en el puerto: 9898El nombre del archivo copiado se recuperará.txt en el lado del servidor
Paso 4: Ahora abra la terminal en el sistema A_client.
Paso 5: vaya a la ruta donde el cliente.py y muestra.txt están presentes.
Paso 6: ahora ejecute el cliente.py como a continuación
cliente python3.pyHemos observado que necesitamos conocer la dirección IP del servidor. Podemos ejecutar el siguiente comando para conocer la dirección IP del sistema B_server.
ifconfig
Ahora la salida del sistema A_client debería ser así
################## El siguiente mensaje se recibe desde el servidor ################################################################################################################################################################| --------------------------------- |
Hola cliente [dirección IP: 192.168.1.102],
** Bienvenido al servidor **
-Servidor
| --------------------------------- |
Paso 7: ahora vaya a B_server y busque la salida a continuación
El archivo se ha copiado correctamenteEl servidor Cerro La conexion
Paso 8: debe haber un nombre de archivo recv.txt en la carpeta del servidor. El contenido de esta recv.txt debe ser la misma muestra.TXT.
Así que hemos copiado con éxito un archivo del cliente al servidor a través de la red a través del programa Python.
Explicaciones del código:
Hay dos archivos de Python servidor.py y cliente.py.
Tenga en cuenta que explicaremos una vez si algún código es el mismo dentro del servidor.py y cliente.py.
- servidor.py:
Esta es la línea shebang, lo que significa que por defecto este servidor.py debería usar python3. Veamos una ventaja de esta línea.
Hemos ejecutado el servidor.py o cliente.py me gusta python3 <.py file name>. Ahora sin usar python3 podemos ejecutar el archivo python. Siga los siguientes comandos
Vaya al modo de superusuario:
suDar todo el permiso a .archivo py:
servidor chmod 777.pyEjecutar servidor.py:
./servidor.py import socketImportando la biblioteca de sockets al programa Python a medida que avanzamos
usar el zócalo para la conexión.
s = enchufe.enchufe()
Estamos creando un objeto "s" para acceder a todos los métodos de socket. Este es un concepto de programación orientada a objetos.
PUERTO = 9898Ahora elegimos un puerto donde el servidor estará escuchando. Podemos usar un puerto no reservado en lugar de este.
s.enlazar ((", PUERTO))Usamos el método de vinculación para vincular la dirección IP del servidor a ese puerto [9898]. Una observación es que podríamos haber usado la dirección IP exacta del servidor en lugar del primer argumento del método de vinculación, pero elegimos dejarlo en blanco ya que esto funciona bien.
s.bind ((dirección IP, PUERTO))file = open ("recv.txt "," wb ")
Hemos abierto un nombre de archivo "recv.txt ”en el servidor para el modo de escritura y obtuvo el puntero de archivo. Esto es necesario ya que tenemos que copiar un archivo de texto del cliente.
mientras que es verdadero:Comencemos un bucle while infinito, ya que el trabajo del servidor es esperar hasta que un cliente se comunique con el servidor en ese puerto 9898. Entonces, se requiere este bucle while.
conn, addr = s.aceptar()Este código es para aceptar cualquier solicitud de conexión entrante del cliente. Conn utilizará "conn " para comunicarse con el cliente y "Dirección" es la dirección IP del cliente que ha enviado una solicitud de conmoción a este servidor en el puerto 9898.
msg = "\ n \ n | --------------------------------- | \ n Hola cliente [dirección IP:"+ addr [0] +"], \ n ** Bienvenido al servidor ** \ n -Servidor \ n
| --------------------------------- | \ n \ n \ n "
Este código es para crear un mensaje para enviar al cliente. Este mensaje debe imprimirse en el terminal del cliente. Esto confirma que el cliente puede comunicarse con el servidor.
conectar.enviar (msg.codificar())Ahora tenemos el mensaje listo y luego lo enviamos al cliente usando ese "Conn". Este código en realidad envía un mensaje al cliente.
RecvData = conexión.recv (1024)Este código está recibiendo los datos que se envían desde el lado del cliente. En nuestro caso estamos esperando el contenido de la muestra.txt en "RecvData".
mientras RecvData:Un bucle while más con la condición RecvData no está vacío. En nuestro caso no esta vacio.
expediente.escribir (RecvData)Una vez que tengamos contenido dentro "RecvData" entonces estamos escribiendo en ese archivo "Recv.TXT" usando el puntero de archivo "expediente".
RecvData = conexión.recv (1024)Nuevamente tratando de recibir si hay algún dato del cliente. Una vez "RecvData" no tiene datos, el código romperá el ciclo while.
expediente.cerca()Esto simplemente cerrará el puntero del archivo cuando terminemos con la escritura del archivo.
conectar.cerca()Esto cerrará la conexión con el cliente.
roturaEsto saldrá del bucle while infinito en B_server.
- cliente.py:
Importando la biblioteca sys como queremos, use la función de argumento en Python.
si (len (sys.argv)> 1):ServerIp = sys.argv [1]
demás:
print ("\ n \ n Ejecutar como \ n cliente python3.py < serverip address > \ n \ n ")
salir (1)
A medida que pasamos la dirección IP de B_server después del nombre de archivo del cliente.py mientras se ejecuta, necesitamos capturar esa dirección IP del servidor dentro del cliente.
... si (len (sys.argv)> 1): => Para asegurarse de que el usuario pase al menos un argumento como dirección IP y capture esa dirección IP insdie "Servidor IP".
Si el usuario no pasa al menos un argumento, el código muestra ayuda y sale del código.
PUERTO = 9898Este tiene que ser el mismo puerto que se menciona en el lado B_server.
s.conectar ((ServerIp, PORT))Este código hará la conexión TCP a la IP del servidor con ese puerto. Cualquier error en este punto da como resultado fallas en la conexión.
file = open ("muestra.txt "," rb ")Estamos abriendo "muestra.txt ”en modo lectura para leer solo contenido.
SendData = archivo.leer (1024)Leer el contenido del archivo y poner dentro "Enviar datos" variable.
while SendData:Estamos comenzando un bucle while si "Enviar datos" tiene datos. En nuestro caso, si "muestra.txt "no está vacío, debería tener datos.
s.enviar (SendData)Ahora podemos enviar contenido de "muestra.TXT" al servidor usando el objeto socket "s".
SendData = archivo.leer (1024)De nuevo leyendo si queda algo. Entonces no habrá nada que leer del archivo "Enviar datos" estará vacío y saldrá del bucle while.
s.cerca()Esto no cierra la conexión del lado del cliente.
Lado del servidor de capturas de pantalla de Ubuntu
Capturas de pantalla de Ubuntu Lado del cliente
Combinaciones probadas:
- Linux como servidor y Linux como cliente: PASS
- Linux como cliente y Linux como servidor: PASS
- Linux como servidor y Windows10 como cliente: PASS
- Linux como cliente y Windows10 como servidor: PASS
La recomendación es utilizar dos sistemas Linux para servidor y cliente.
Errores esperados:
- Puede ver el siguiente error si el servidor no se está ejecutando en el puerto 9898
Rastreo (llamadas recientes más última):
Archivo "cliente.py ", línea 22, ens.conectar ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Conexión rechazada
- Se ve el siguiente error si la dirección IP no se pasa en el lado del cliente
Corre como
cliente python3.py < serverip address >- Se ve el siguiente error si 1S t el argumento en el lado del cliente no es una dirección IP
Rastreo (llamadas recientes más última):
Archivo "cliente.py ", línea 22, ens.conectar ((ServerIp, PORT))
enchufe.gaierror: [Errno -2] Nombre o servicio desconocido
- Se ve el siguiente error si el puerto se usa como 98980
Rastreo (llamadas recientes más última):
Archivo "cliente.py ", línea 22, ens.conectar ((ServerIp, PORT))
OverflowError: getsockaddrarg: el puerto debe ser 0-65535.
- A continuación, se ve el error si "muestra.txt ”no está presente en el lado del cliente.
Rastreo (llamadas recientes más última):
Archivo "cliente.py ", línea 25, enfile = open ("muestra.txt "," rb ")
FileNotFoundError: [Errno 2] No existe tal archivo o directorio: 'muestra.TXT'
Conclusión:
Usando este programa podemos enviar un archivo de texto simple de un sistema a otro sistema a través de la red usando el programa Python. Esto nos da un aprendizaje básico de la programación de python y socket también para enviar datos a través de la red.