Pitón

Envío de transferencia de archivos de Python Socket

Envío de transferencia de archivos de Python Socket
La intención de este artículo es aprender cómo transferir un archivo de texto a través de la red a través del programa Python. Esta transferencia de archivos se basa en el modelo de cliente de servidor para usar la programación de sockets en python3+.

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:

Limitaciones:

Antes de continuar, debemos saber que existen algunas limitaciones de este programa.

Configurar requisitos:

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.py

No debería haber ningún error y debería ver las impresiones a continuación

El servidor aparece en el puerto: 9898

El 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.py

Hemos 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 correctamente
El 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.

  1. servidor.py:
#!/ usr / bin / env python3

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:

su

Dar todo el permiso a .archivo py:

servidor chmod 777.py

Ejecutar servidor.py:

./servidor.py import socket
Importando 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 = 9898

Ahora 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.

rotura

Esto saldrá del bucle while infinito en B_server.

  1. cliente.py:
importar sys

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 = 9898

Este 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:

  1. 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, en
s.conectar ((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Conexión rechazada
  1. 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 >
  1. 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, en
s.conectar ((ServerIp, PORT))
enchufe.gaierror: [Errno -2] Nombre o servicio desconocido
  1. Se ve el siguiente error si el puerto se usa como 98980

Rastreo (llamadas recientes más última):

Archivo "cliente.py ", línea 22, en
s.conectar ((ServerIp, PORT))
OverflowError: getsockaddrarg: el puerto debe ser 0-65535.
  1. 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, en
file = 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.

Las mejores distribuciones de Linux para juegos en 2021
El sistema operativo Linux ha recorrido un largo camino desde su apariencia original, simple y basada en servidor. Este sistema operativo ha mejorado ...
Cómo capturar y transmitir su sesión de juego en Linux
En el pasado, los juegos solo se consideraban un pasatiempo, pero con el tiempo la industria del juego experimentó un gran crecimiento en términos de ...
Los mejores juegos para jugar con el seguimiento de manos
Oculus Quest presentó recientemente la gran idea del seguimiento manual sin controladores. Con un número cada vez mayor de juegos y actividades que ej...