Python Socket File Transfer Invia

Python Socket File Transfer Invia
L'intenzione di questo articolo è di imparare Come trasferire un file di testo tramite la rete tramite il programma Python. Questo trasferimento di file si basa sul modello client server per utilizzare la programmazione socket in python3+.

Diagramma di configurazione di base:

Ecco il diagramma di configurazione di base per eseguire questo programma.

Per semplicità chiameremo il sistema A come A_Client e il sistema B come B_Server in tutto l'articolo.

Requisiti del file:

Abbiamo bisogno server.Py E questo file dovrebbe essere presente sul sistema server. Nel nostro caso server.Py dovrebbe essere al sistema B_Server.

Altri due file cliente.Py E campione.TXT dovrebbe essere presente sul sistema client. Nel nostro caso quei due file dovrebbero essere presenti su A_Client System.

Ipotesi:

Ecco i presupposti:

  • Dovremmo avere due sistemi Linux con accesso al terminale.
  • Il sapore Linux preferibile è Ubuntu.
  • Python3 dovrebbe essere installato.
  • Entrambi i sistemi Linux dovrebbero essere in grado di ping l'un l'altro. Utilizzo ping comando di controllare il ping.
  • Un sistema dovrebbe fungere da server e altro sistema dovrebbe fungere da client in un momento particolare.

Limitazioni:

Prima di procedere ulteriormente dovremmo sapere che ci sono alcune limitazioni di questo programma.

  • Python3+ dovrebbe essere installato per eseguire questo programma. È possibile osservare un errore o un comportamento diverso se eseguito su versioni precedenti di Python.
  • Solo il file di testo può essere trasferito tramite questo programma a partire da ora. Qualsiasi altro file di formato che non contenga il testo può fallire.
  • Le eccezioni di programmazione di base sono state gestite nel programma.
  • Il programma può o meno funzionare su altri operati operativi di Ubuntu.
  • Il file di testo dovrebbe essere corto sul lato client poiché è stata utilizzata la dimensione del buffer di 1024 byte.

Requisiti di configurazione:

  • Abbiamo bisogno di almeno un sistema Linux per provare questo programma. Ma la raccomandazione è di utilizzare due diversi sistemi Linux collegati tramite la rete.
  • Due sistemi devono essere collegati tramite Ethernet o Wi-Fi o altre connessioni.

Codice sorgente del server:

https: // github.com/linuxhintcode/websamples/blob/master/python_send_file/server.Py

Codice sorgente client:

https: // github.com/linuxhintcode/websamples/blob/master/python_send_file/client.Py

#!/usr/bin/env python3
# Importazione di librerie
Società di importazione
Import sys
# Catturiamo il primo argomento come server IP
if (len (sys.argv)> 1):
Serverip = sys.argv [1]
altro:
print ("\ n \ n esegui come \ n python3 client.py \ n \ n ")
uscita (1)
# Ora possiamo creare oggetto socket
S = socket.PRESA()
# Scegli una porta e connettiamo a quella porta
Porta = 9898
# Consente di connetterci a quella porta in cui il server potrebbe essere in esecuzione
S.connect ((serverip, porta))
# Possiamo inviare un campione di file.TXT
File = Open ("Esempio.txt "," RB ")
SendData = File.Leggi (1024)
Mentre Senddata:
# Ora possiamo ricevere dati dal server
Stampa ("\ n \ n ################## Il messaggio di seguito viene ricevuto dal server ################## \ n \ n ", s.RECV (1024).decode ("UTF-8"))
#Now Invia il contenuto del campione.txt al server
S.Send (SendData)
SendData = File.Leggi (1024)
# Chiudi la connessione dal lato client
S.vicino()

Come eseguire programmi e output previsto:

Ecco i passaggi per eseguire il programma.

Step1: vai al sistema B_Server e apri un terminale. Short taglio per aprire un terminale è Alt+ctrl+t.

Step2: ora vai il percorso in cui il server.Py è presente.

Passaggio3: ora esegui il server.Py come sotto

Server Python3.Py

Non dovrebbero esserci errori e dovresti vedere di seguito le stampe

Il server è elencato sulla porta: 9898

Il nome del file copiato sarà recv.txt sul lato server

Step4: ora Apri Terminal su A_Client System.

Step5: vai sul percorso in cui il cliente.Py e campione.txt sono presenti.

Passaggio 6: ora esegui il client.Py come sotto

Cliente Python3.Py

Abbiamo osservato che dobbiamo conoscere l'indirizzo IP del server. Possiamo eseguire il comando di seguito per conoscere l'indirizzo IP del sistema B_Server.

ifconfig

Ora l'output del sistema A_Client dovrebbe essere così

#######Com
| ------------------------------------- |
Ciao client [Indirizzo IP: 192.168.1.102],
** Benvenuti nel server **
-server
| ------------------------------------- |

Step7: ora vai a B_Server e cerca di seguito l'output

Il file è stato copiato con successo
Il server ha chiuso la connessione

Step8: dovrebbe esserci un nome file recv.txt nella cartella del server. Il contenuto di questo recv.txt dovrebbe essere lo stesso campione.TXT.

Quindi abbiamo copiato correttamente un file da client a server tramite la rete tramite Python Program.

Spiegazioni del codice:

Ci sono due file Python server.Py E cliente.Py.

Si noti che spiegheremo una volta se qualsiasi codice è lo stesso all'interno del server.py e cliente.Py.

  1. server.PY:
#!/usr/bin/env python3

Questa è la linea Shebang che significa per impostazione predefinita questo server.Py dovrebbe usare python3. Vediamo un vantaggio di questa linea.

Abbiamo eseguito il server.py o cliente.Py come Python3 . Ora senza usare Python3 possiamo eseguire il file Python. Seguire i comandi seguenti

Vai alla modalità Super User:

Su

Dare tutto il permesso a .Py File:

Server CHMOD 777.Py

Esegui server.PY:

./server.Py
Società di importazione
#IMPORT BIBLIBLY STOCKING IN PROGRAMMA PYTHON ESSERE UTILIZZARE SCUPA PER LA CONNETTIVO.
S = socket.PRESA()

Stiamo creando un oggetto "S" Per accedere a tutti i metodi di socket. Questo è un concetto di oops.

Porta = 9898

Ora scegliamo una porta in cui il server ascolterà. Possiamo usare la porta non riservata invece di questo.

S.bind ((", porta))

Utilizziamo il metodo BIND per legare l'indirizzo IP del server a quella porta [9898]. Un'osservazione è che avremmo potuto utilizzare l'indirizzo IP esatto del server al posto del primo argomento del metodo Bind, ma scegliamo di lasciarci vuoti mentre funziona bene.

S.bind ((indirizzo IP, porta))
File = Open ("RECV.txt "," wb ")

Abbiamo aperto un nome di file “Recv.txt ”nel server per la modalità di scrittura e ottiene un puntatore del file. Questo è richiesto perché dobbiamo copiare un file di testo dal client.

mentre è vero:

Iniziamo un infinito durante il ciclo poiché il lavoro del server è attendere fino a quando un client comunica con il server su quella porta 9898. Quindi questo è richiesto loop.

Conn, addr = s.accettare()

Questo codice deve accettare qualsiasi richiesta di connessione in arrivo dal client. Conn utilizzerà "Conn " per comunicare con il cliente e "ADDR" è l'indirizzo IP del client che ha inviato la richiesta di confusione a questo server sulla porta 9898.

msg = "\ n \ n | --------------------------------- | \ n HI Client [Indirizzo IP:
" + addr [0] +"], \ n ** Benvenuti al server ** \ n -server \ n
| ------------------------------------- | \ n \ n \ n "

Questo codice è quello di creare un messaggio da inviare al client. Questo messaggio deve essere stampato sul terminale client. Ciò conferma che il client è in grado di comunicare con il server.

Conn.Invia (msg.codificare())

Ora abbiamo il messaggio pronto e poi inviarlo al client utilizzando quello "Conn". Questo codice invia effettivamente il messaggio al client.

Recvdata = Conn.RECV (1024)

Questo codice sta ricevendo tutti i dati inviati dal lato client. Nel nostro caso ci aspettiamo il contenuto del campione.txt in "Recvdata".

Mentre recvdata:

Un altro giro mentre il ciclo con la condizione recvdata non è vuoto. Nel nostro caso non è vuoto.

file.Scrivi (recvdata)

Una volta che abbiamo contenuti all'interno "Recvdata" Quindi stiamo scrivendo a quel file “Recv.TXT" Usando il puntatore del file "file".

Recvdata = Conn.RECV (1024)

Di nuovo cercando di ricevere se ci sono dati dal client. Una volta "Recvdata" non ha dati che il codice romperà il ciclo while.

file.vicino()

Questo chiuderà semplicemente il puntatore del file come abbiamo fatto con il file.

Conn.vicino()

Questo chiuderà la connessione con il client.

rottura

Questo uscirà da Infinite mentre loop su B_Server.

  1. cliente.PY:
Import sys

Importazione della biblioteca sys come vogliamo utilizzare la struttura di argomento in Python.

if (len (sys.argv)> 1):
Serverip = sys.argv [1]
altro:
print ("\ n \ n esegui come \ n python3 client.py \ n \ n ")
uscita (1)

Mentre passiamo l'indirizzo IP di B_Server dopo il client Nome file.Py durante l'esecuzione, dobbiamo catturare quell'indirizzo IP del server all'interno del client.

... se (len (sys.argv)> 1): => per assicurarsi che l'utente passi almeno un argomento come indirizzo IP e cattura quell'indirizzo IP "IP del server".

Se l'utente non supera almeno un codice argomento mostra aiuto ed esce dal codice.

Porta = 9898

Questo deve essere la stessa porta menzionata sul lato B_Server.

S.connect ((serverip, porta))

Questo codice eseguirà la connessione TCP all'IP del server con quella porta. Qualunque cosa non vada in questo Ponint si traduce in guasti in connessione.

File = Open ("Esempio.txt "," RB ")

Stiamo aprendo "campione.txt ”in modalità lettura per leggere solo il contenuto.

SendData = File.Leggi (1024)

Leggere il contenuto del file e mettere dentro "Invia i dati" variabile.

Mentre Senddata:

Ne stiamo iniziando uno durante il ciclo se "Invia i dati" ha dati. Nel nostro caso se "campione.txt ”non è vuoto, dovrebbe avere dati.

S.Send (SendData)

Ora possiamo inviare contenuti di "campione.TXT" al server utilizzando oggetto socket "S".

SendData = File.Leggi (1024)

Leggendo di nuovo se rimane qualcosa. Quindi non ci sarà nulla da leggere dal file "Invia i dati" sarà vuoto e uscirà da While Loop.

S.vicino()

Questo non è chiuso la connessione dal lato client.

Ubuntu Screenshot Server Side

Ubuntu Screenshot lato client

Combinazioni testate:

  • Linux come server e Linux come client: pass
  • Linux come client e Linux come server: pass
  • Linux come server e Windows10 come client: pass
  • Linux come client e Windows10 come server: pass

La raccomandazione è di utilizzare due sistemi Linux per server e client.

Errori previsti:

  1. È possibile vedere di seguito l'errore se il server non è in esecuzione sulla porta 9898

Traceback (chiamata più recente per ultima):

File "client.py ", riga 22, in
S.connect ((serverip, porta))
ConnectionRefusedError: [ERRNO 111] Connessione rifiutata
  1. Di seguito viene visualizzato l'errore se l'indirizzo IP non viene passato sul lato client

Corri come

Cliente Python3.Py < serverip address >
  1. Sotto l'errore viene visualizzato se 1st L'argomento sul lato client non è un indirizzo IP

Traceback (chiamata più recente per ultima):

File "client.py ", riga 22, in
S.connect ((serverip, porta))
PRESA.Gaierror: [errno -2] nome o servizio non noto
  1. Di seguito viene visualizzato l'errore se la porta è utilizzata come 98980

Traceback (chiamata più recente per ultima):

File "client.py ", riga 22, in
S.connect ((serverip, porta))
OverFlowerror: getSockaddrarg: la porta deve essere 0-65535.
  1. Sotto l'errore viene visualizzato se “campione.txt "non è presente sul lato client.

Traceback (chiamata più recente per ultima):

File "client.py ", riga 25, in
File = Open ("Esempio.txt "," RB ")
FileNotfounderror: [Errno 2] Nessun file o directory: 'Esempio.TXT'

Conclusione:

Utilizzando questo programma possiamo inviare un semplice file di testo da un sistema a un altro sistema tramite rete utilizzando il programma Python. Questo ci dà l'apprendimento di base della programmazione Python e Socket anche per l'invio di dati su rete.