Invio trasferimento file socket Python

Python Socket File Transfer Send



L'intenzione di questo articolo è imparare come trasferire un file di testo in rete tramite il programma python . Questo trasferimento di file si basa sul modello client del server per utilizzare la programmazione socket in python3+.

Ecco lo schema di configurazione di base per eseguire questo programma.









Per semplicità chiameremo System A come A_client e System B come B_server in tutto l'articolo.



Requisiti del file:

Abbiamo bisogno server.py e questo file dovrebbe essere presente nel sistema del server. Nel nostro caso server.py dovrebbe trovarsi nel sistema B_server.





Altri due file cliente.py e campione.txt dovrebbe essere presente nel sistema client. Nel nostro caso questi due file dovrebbero essere presenti nel sistema A_client.

Ipotesi:

Ecco le ipotesi:



  • Dovremmo avere due sistemi Linux con accesso da terminale.
  • Il gusto Linux preferibile è Ubuntu .
  • Python3 dovrebbe essere installato.
  • Entrambi i sistemi Linux dovrebbero essere in grado di eseguire il ping a vicenda. Utilizzo ping comando per controllare il ping.
  • Un sistema dovrebbe fungere da server e un altro sistema dovrebbe fungere da client in un determinato momento.

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.
  • Al momento è possibile trasferire solo file di testo tramite questo programma. Qualsiasi altro file di formato che non contiene testo potrebbe non riuscire.
  • Le eccezioni di programmazione di base sono state gestite nel programma.
  • Il programma può o non può essere eseguito su un sistema operativo diverso da Ubuntu.
  • Il file di testo dovrebbe essere corto sul lato client poiché è stata utilizzata una 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 rete.
  • Due sistemi dovrebbero essere collegati tramite Ethernet o Wi-Fi o qualsiasi altra connessione.

Codice sorgente del server:

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

Codice sorgente cliente:

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

Come eseguire i programmi e l'output previsto:

Ecco i passaggi per eseguire il programma.

Passaggio 1: vai al sistema B_server e apri un terminale. La scorciatoia per aprire un terminale è Alt+Ctrl+t.

Passaggio 2: ora vai al percorso in cui è presente server.py.

Passaggio 3: ora esegui server.py come di seguito

server python3.pi

Non dovrebbero esserci errori e dovresti vedere le stampe sottostanti

Il server è elencato sulla porta: 9898

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

Passaggio 4: ora apri il terminale sul sistema A_client.

Passaggio 5: vai al percorso in cui sono presenti client.py e sample.txt.

Passaggio 6: ora esegui client.py come di seguito

cliente python3.pi <IP di sistema B_server>

Abbiamo osservato che abbiamo bisogno di conoscere l'indirizzo IP del server. Possiamo eseguire il comando seguente per conoscere l'indirizzo IP del sistema B_server.

ifconfig

Ora l'output del sistema A_client dovrebbe essere così

################## Il messaggio di seguito è stato ricevuto dal server ##################
| --------------------------------- |
Ciao cliente[Indirizzo IP: 192.168.1.102],
**Benvenuto nel server**
-Server
| --------------------------------- |

Step7: Ora vai su B_server e cerca l'output sotto

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 sample.txt.

Quindi abbiamo copiato con successo un file dal client al server tramite la rete tramite il programma Python.

Spiegazioni del codice:

Ci sono due file Python server.py e cliente.py .

Nota che spiegheremo una volta se il codice è lo stesso all'interno di server.py e client.py.

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

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

Abbiamo eseguito il server.py o client.py like pitone3. Ora senza usare python3 possiamo eseguire il file python. Segui i comandi seguenti

Vai alla modalità super utente:

suo

Dai tutti i permessi al file .py:

chmod777server.pi

Esegui server.py:

./server.pi importare presa
importazionepresalibreria nel programma Pythoncomestiamo andando
usarepresa perconnessione.

S = presa.presa()

Stiamo creando un oggetto S per accedere a tutti i metodi di socket. Questo è un concetto di OOP.

PORTA= 9898

Ora scegliamo una porta in cui il server sarà in ascolto. Possiamo usare la porta non riservata invece di questa.

S.legamento(('',PORTA))

Usiamo il metodo bind per associare 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 abbiamo scelto di lasciare il campo vuoto poiché funziona bene.

S.legamento((indirizzo IP,PORTA))
file = aprire('recv.txt', 'wb')

Abbiamo aperto un nome file recv.txt nel server per la modalità di scrittura e abbiamo ottenuto il puntatore al file. Ciò è necessario poiché dobbiamo copiare un file di testo dal client.

mentre Vero:

Avviamo un ciclo while infinito poiché il lavoro del server è attendere che un client comunichi con il server su quella porta 9898. Quindi questo ciclo while è richiesto.

connessione,indirizzo=S.accettare()

Questo codice deve accettare qualsiasi richiesta di connessione in entrata dal client. Conn userà connessione per comunicare con il cliente e indirizzo è l'indirizzo IP del client che ha inviato una richiesta di commozione a questo server sulla porta 9898.

msg= ' | --------------------------------- | Ciao cliente[indirizzo IP:
'
+ indirizzo[0]+'], **Benvenuto nel server** -Server
| --------------------------------- | '

Questo codice serve a creare un messaggio da inviare al client. Questo messaggio dovrebbe essere stampato sul terminale del cliente. Ciò conferma che il client è in grado di comunicare con il server.

conn.Inviare(msg.codificare())

Ora abbiamo il messaggio pronto, quindi lo inviamo al client usando quello conn. Questo codice invia effettivamente un messaggio al client.

Dati recv=conn.recv(1024)

Questo codice sta ricevendo tutti i dati inviati dal lato client. Nel nostro caso ci aspettiamo il contenuto di sample.txt in Dati recv .

mentreDati di ricezione:

Un altro ciclo while con la condizione RecvData non è vuoto. Nel nostro caso non è vuoto.

file.Scrivi(Dati recv)

Una volta che abbiamo contenuto dentro Dati recv quindi stiamo scrivendo su quel file recv.txt usando il puntatore di file file.

Dati recv=conn.recv(1024)

Ancora una volta cercando di ricevere se ci sono dati dal client. Una volta Dati recv non ha dati il ​​codice interromperà il ciclo while.

file.chiudere()

Questo chiuderà semplicemente il puntatore del file mentre abbiamo finito con la scrittura del file.

conn.chiudere()

Questo chiuderà la connessione con il client.

rottura

Questo deve uscire dal ciclo while infinito su B_server.

  1. cliente.py:
importare sistema

Importando la libreria sys come vogliamo usare la funzione di argomento in python.

Se (len(sistema.argv) > 1):
IP del server= sistema.argv[1]
altro:
Stampa(' Corri come python3 client.py ')
Uscita(1)

Quando passiamo l'indirizzo IP di B_server dopo il nome file client.py durante l'esecuzione, dobbiamo catturare l'indirizzo IP del server all'interno del client.

…..if (len(sys.argv) > 1): => Per assicurarsi che l'utente passi almeno un argomento come indirizzo IP e catturi quell'indirizzo IP insdie IP del server.

Se l'utente non passa almeno un argomento, il codice mostra l'aiuto e esce dal codice.

PORTA= 9898

Questa deve essere la stessa porta menzionata sul lato B_server.

S.Collegare((IP del server,PORTA))

Questo codice effettuerà la connessione TCP all'IP del server con quella porta. Qualsiasi cosa sbagliata in questo punto si traduce in fallimenti in connessione.

file = aprire('campione.txt', 'rb')

Stiamo aprendo sample.txt in modalità di lettura per leggere solo il contenuto.

Invia i dati= file.leggere(1024)

Leggere il contenuto del file e inserirlo Invia i dati variabile.

mentreInvia i dati:

Stiamo iniziando un ciclo while se Invia i dati ha dati. Nel nostro caso, se sample.txt non è vuoto, dovrebbe contenere dati.

S.Inviare(Invia i dati)

Ora possiamo inviare il contenuto di campione.txt al server usando l'oggetto socket S.

Invia i dati= file.leggere(1024)

Di nuovo leggendo se c'è rimasto qualcosa. Quindi non ci sarà nulla da leggere dal file Invia i dati sarà vuoto e uscirà dal ciclo while.

S.chiudere()

Questo non è chiudere la connessione dal lato client.

Schermate di Ubuntu Lato server

Schermate di Ubuntu 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. Puoi vedere l'errore di seguito se il server non è in esecuzione sulla porta 9898

Traceback (ultima chiamata più recente):

File'client.py',linea22, in <modulo>
S.Collegare((IP del server,PORTA))
ConnectionRefusedError:[Errno111]Connessione rifiutata
  1. L'errore seguente viene visualizzato se l'indirizzo IP non viene passato sul lato client

Corri come

cliente python3.pi <indirizzo IP del server>
  1. L'errore sotto viene visualizzato se 1nsargomento sul lato client non è un indirizzo IP

Traceback (ultima chiamata più recente):

File'client.py',linea22, in <modulo>
S.Collegare((IP del server,PORTA))
presa.gaierror:[Errno -2]Nomeoserviziononconosciuto
  1. Di seguito viene visualizzato l'errore se la porta viene utilizzata come 98980

Traceback (ultima chiamata più recente):

File'client.py',linea22, in <modulo>
S.Collegare((IP del server,PORTA))
OverflowError: getsockaddrarg: la porta deve essere0-65535.
  1. L'errore seguente viene visualizzato se sample.txt non è presente sul lato client.

Traceback (ultima chiamata più recente):

File'client.py',linea25, in <modulo>
file = aprire('campione.txt', 'rb')
FileNotFoundError:[Errno2]niente del generefile oelenco:'campione.txt'

Conclusione:

Usando questo programma possiamo inviare un semplice file di testo da un sistema a un altro sistema attraverso la rete usando il programma python. Questo ci dà l'apprendimento di base della programmazione di Python e socket anche per l'invio di dati sulla rete.