Przesyłanie pliku gniazda Python Wysyłanie

Przesyłanie pliku gniazda Python Wysyłanie
Intencją tego artykułu jest nauczenie się Jak przenieść plik tekstowy przez sieć za pośrednictwem programu Python. Ten przesyłanie plików jest oparte na modelu klienta serwera do korzystania z programowania gniazda w Python3+.

Podstawowy schemat konfiguracji:

Oto podstawowy schemat konfiguracji do uruchomienia tego programu.

Dla uproszczenia nazywamy system A jako A_Client i System B jako B_Server w całym artykule.

Wymagania dotyczące pliku:

Potrzebujemy serwer.py i ten plik powinien być obecny w systemie serwerowym. Na naszym serwerze.PY powinien znajdować się w systemie B_Server.

Kolejne dwa pliki klient.py I próbka.tekst powinien być obecny w systemie klientów. W naszym przypadku te dwa pliki powinny być obecne w systemie A_Client.

Założenia:

Oto założenia:

  • Powinniśmy mieć dwa systemy Linux z dostępem do terminalu.
  • Preferowany smak Linuksa jest Ubuntu.
  • Python3 należy zainstalować.
  • Oba systemy Linux powinny się nawzajem pingować. Używać świst Polecenie do sprawdzenia ping.
  • Jeden system powinien działać jako serwer, a inny system powinien działać jako klient w określonym czasie.

Ograniczenia:

Zanim przejdziemy dalej, powinniśmy wiedzieć, że istnieją pewne ograniczenia tego programu.

  • Python3+ należy zainstalować w celu uruchomienia tego programu. Możesz zaobserwować błąd lub inne zachowanie, jeśli uruchomi się w starszych wersjach Pythona.
  • Tylko plik tekstowy może być przesyłany przez ten program. Każdy inny plik formatowy, który nie zawiera tekstu, może się nie powieść.
  • Podstawowe wyjątki programowania zostały obsługiwane w programie.
  • Program może, ale nie musi być uruchomiony na innym systemie operacyjnym niż Ubuntu.
  • Plik tekstowy powinien być krótki po stronie klienta, ponieważ użyto rozmiaru bufora 1024 bajtów.

Skonfiguruj wymagania:

  • Potrzebujemy co najmniej jednego systemu Linux, aby wypróbować ten program. Ale zalecenie polega na użyciu dwóch różnych systemów Linux, które są podłączone za pośrednictwem sieci.
  • Dwa systemy powinny być podłączone za pośrednictwem Ethernet lub Wi-Fi lub innych połączeń.

Kod źródłowy serwera:

https: // github.com/LinuxhintCode/WebSamples/Blob/Master/Python_Send_file/Server.py

Kod źródłowy klienta:

https: // github.com/LinuxhintCode/WebSamples/Blob/Master/Python_Send_file/Client.py

#!/usr/bin/env python3
# Importowanie bibliotek
Gniazdo importu
Import Sys
# Złóżmy pierwszy argument jako IP serwera
if (len (sys.argv)> 1):
ServerIP = Sys.Argv [1]
w przeciwnym razie:
Drukuj ("\ n \ n Uruchom jak \ n Python3 Klient.py \ n \ n ”)
Wyjście (1)
# Teraz możemy utworzyć obiekt gniazda
S = gniazdo.gniazdo elektryczne()
# Wybierzmy jeden port i podłączmy do tego portu
Port = 9898
# Połączmy się z tym portem, w którym może być uruchomiony serwer
S.Connect ((serverip, port))
# Możemy wysłać próbkę pliku.tekst
plik = otwarty (”próbka.txt "," rb ")
Plik senddata =.Przeczytaj (1024)
podczas senddata:
# Teraz możemy odbierać dane z serwera
print ("\ n \ n ################### ° n \ n ", s.Recv (1024).dekoduj („UTF-8”))
#Now Wyślij zawartość próbki.TXT do serwera
S.Wyślij (senddata)
Plik senddata =.Przeczytaj (1024)
# Zamknij połączenie od strony klienta
S.zamknąć()

Jak uruchamiać programy i oczekiwane wyniki:

Oto kroki do wykonania programu.

Krok 1: Przejdź do systemu B_Server i otwórz terminal. Krótkie cięcie, aby otworzyć terminal Alt+ctrl+t.

Krok 2: Teraz idź ścieżką, na której serwer.Py jest obecny.

Krok3: Teraz uruchom serwer.py jak poniżej

Serwer Python3.py

Nie powinno być żadnych błędów i powinieneś zobaczyć poniżej wydruki

Serwer jest listą na porcie: 9898

Skopiowana nazwa pliku będzie recv.TXT po stronie serwera

Krok 4: Teraz otwarty terminal w systemie A_Client.

Krok 5: Idź na ścieżkę, na której klient.PY i próbka.TXT są obecne.

Krok6: Teraz uruchom klienta.py jak poniżej

Klient Python3.py

Zauważyliśmy, że musimy znać adres IP serwera. Możemy wykonać poniższe polecenie, aby poznać adres IP systemu B_Server.

ifconfig

Teraz wyjście systemu A_Client powinno być takie

####################Poniżej wiadomość jest odbierana z serwera ###########################
| --------------------------------- |
Cześć klient [adres IP: 192.168.1.102],
** Witamy na serwerze **
-serwer
| --------------------------------- |

Krok 7: Teraz przejdź do B_Server i poszukaj poniżej wyjścia

Plik został pomyślnie skopiowany
Serwer przerwał połączenie

Krok 8: Powinna być jedna nazwa pliku recv.TXT w folderze serwera. Treść tego BECV.TXT powinien być taką samą próbką.tekst.

Dlatego pomyślnie skopiowaliśmy plik z klienta do serwera przez sieć za pośrednictwem programu Python.

Objaśnienia kodu:

Istnieją dwa pliki Pythona serwer.py I klient.py.

Zauważ, że wyjaśnimy raz, jeśli jakikolwiek kod jest taki sam wewnątrz serwera.PY i klient.py.

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

To jest linia shebang, co oznacza domyślnie ten serwer.PY powinien użyć Python3. Zobaczmy jedną zaletę tej linii.

Wykonaliśmy serwer.PY lub klient.py jak Python3 . Teraz bez użycia Python3 możemy wykonać plik Python. Postępuj poniżej poleceń

Przejdź do trybu super użytkownika:

Su

Daj wszelkie pozwolenie na .plik PY:

Serwer CHMOD 777.py

Uruchom serwer.PY:

./serwer.py
Gniazdo importu
#Importowanie biblioteki gniazd do programu Python, ponieważ będziemy używać gniazda do połączenia.
S = gniazdo.gniazdo elektryczne()

Tworzymy obiekt "S" Aby uzyskać dostęp do wszystkich metod gniazda. To jest koncepcja OOPS.

Port = 9898

Teraz wybieramy jeden port, w którym serwer będzie słuchać. Możemy użyć portu nie zarezerwowanego zamiast tego.

S.bind ((", port))

Używamy metody BIND do wiązania adresu IP serwera z tym portem [9898]. Jedną z obserwacji jest to, że moglibyśmy użyć dokładnego adresu IP serwera zamiast pierwszego argumentu metody wiązania, ale zdecydowaliśmy się na pozostawione puste, ponieważ to działa dobrze.

S.bind ((adres IP, port))
file = otwarte ("recv.txt ",„ wb ”)

Otworzyliśmy jedną nazwę pliku „recv.txt ”na serwerze dla trybu zapisu i wskaźnik pliku. Jest to wymagane, ponieważ musimy skopiować jeden plik tekstowy od klienta.

Choć prawda:

Zacznijmy jeden nieskończony, gdy pętla jako zadaniem serwera jest czekanie, aż klient komunikuje się z serwerem na tym porcie 9898. Więc to, gdy pętla jest wymagana.

conn, addr = s.zaakceptować()

Ten kod ma zaakceptować wszelkie przychodzące żądanie połączenia od klienta. Conn użyje „Conn ” komunikować się z klientem i „Addr” to adres IP klienta, który wysłał żądanie zamieszania na ten serwer na porcie 9898.

msg = "\ n \ n | ------------------------------------- | \ n HI Client [adres IP:
„ + addr [0] +”], \ n ** Witamy na serwerze ** \ n -server \ n
| --------------------------------- | \ n \ n \ n ”

Ten kod ma utworzyć wiadomość do wysłania do klienta. Ta wiadomość powinna być wydrukowana na terminalu klienta. To potwierdza, że ​​klient jest w stanie komunikować się z serwerem.

Conn.Wyślij (MSG.kodować())

Teraz mamy gotową wiadomość, a następnie wysyłamy ją do klienta za pomocą tego „Conn”. Ten kod faktycznie wysyła wiadomość do klienta.

Recvdata = conn.Recv (1024)

Ten kod odbiera wszelkie dane wysyłane od strony klienta. W naszym przypadku oczekujemy treści próbki.txt in „Recvdata”.

Podczas gdy recvdata:

Jeszcze jedno, gdy pętla z warunkami recvdata nie jest pusta. W naszym przypadku nie jest puste.

plik.Write (recvdata)

Gdy mamy treść w środku „Recvdata” Następnie piszemy do tego pliku „BECV.tekst" za pomocą wskaźnika pliku "plik".

Recvdata = conn.Recv (1024)

Ponownie próbuję otrzymać, jeśli są jakieś dane od klienta. Raz „Recvdata” nie ma danych. Kod przełamie pętlę While.

plik.zamknąć()

To po prostu zamknie wskaźnik pliku, gdy skończymy z zapisem pliku.

Conn.zamknąć()

To zamknie połączenie z klientem.

przerwa

To ma wyjść z Infinite podczas pętli w B_Server.

  1. klient.PY:
Import Sys

Importowanie biblioteki SYS, ponieważ chcemy używać zakładu argumentów w Python.

if (len (sys.argv)> 1):
ServerIP = Sys.Argv [1]
w przeciwnym razie:
Drukuj ("\ n \ n Uruchom jak \ n Python3 Klient.py \ n \ n ”)
Wyjście (1)

Gdy przekazujemy adres IP B_SERVER po nazwie pliku klienta.PY Podczas pracy, musimy złapać ten adres IP serwera wewnątrz klienta.

… Jeśli (Len (sys.argv)> 1): => Aby upewnić się, że użytkownik przekazuje co najmniej jeden argument jako adres IP i złapać ten adres IP insdie "IP serwera".

Jeśli użytkownik nie przekazuje co najmniej jednego kodu argumentu, pokazuje pomoc i wyjdzie z kodu.

Port = 9898

To musi być ten sam port, jak wspomniany po stronie B_Server.

S.Connect ((serverip, port))

Ten kod wykonał połączenie TCP z serwerem IP z tym portem. Coś złego w tym Ponint powoduje niepowodzenia w związku.

plik = otwarty (”próbka.txt "," rb ")

Otwieramy „próbkę.txt ”w trybie odczytu, aby odczytać tylko treść.

Plik senddata =.Przeczytaj (1024)

Czytanie zawartości pliku i umieszczenie w środku „Przesłać dane" zmienny.

podczas senddata:

Rozpoczynamy jedną z pętli, jeśli „Przesłać dane" ma dane. W naszym przypadku, jeśli „próbka.txt ”nie jest pusty, powinien mieć dane.

S.Wyślij (senddata)

Teraz możemy wysłać treść "próbka.tekst" do serwera za pomocą obiektu gniazda "S".

Plik senddata =.Przeczytaj (1024)

Ponownie czytanie, jeśli coś się skończy. Więc nie będzie nic do odczytania z pliku "Przesłać dane" będzie pusty i wyjdzie z pętli.

S.zamknąć()

To nie jest zamknięte połączenie od strony klienta.

Ubuntu Screenshots Server Server

Ubuntu zrzut ekranu po stronie klienta

Testowane kombinacje:

  • Linux jako serwer i Linux jako klient: przejść
  • Linux jako klienta i Linux jako serwer: przejść
  • Linux jako serwer i Windows10 jako klient: przejść
  • Linux jako klienta i Windows10 jako serwer: Pass

Zaleceniem jest użycie dwóch systemów Linux dla serwera i klienta.

Oczekiwane błędy:

  1. Możesz zobaczyć poniżej błąd, jeśli serwer nie działa na porcie 9898

Traceback (najnowsze połączenie ostatnie):

Plik „Klient.py ", wiersz 22, w
S.Connect ((serverip, port))
ConnectionRefusedError: [errno 111] Connection odmówił
  1. Poniższy błąd jest widoczny, jeśli adres IP nie jest przekazywany po stronie klienta

Biegnij jak

Klient Python3.py < serverip address >
  1. Poniższy błąd jest widoczny, jeśli 1St Argument po stronie klienta nie jest adresem IP

Traceback (najnowsze połączenie ostatnie):

Plik „Klient.py ", wiersz 22, w
S.Connect ((serverip, port))
gniazdo elektryczne.Gaierror: [errno -2] Nazwa lub usługa nieznana
  1. Poniższy błąd jest widoczny, jeśli port jest używany jak 98980

Traceback (najnowsze połączenie ostatnie):

Plik „Klient.py ", wiersz 22, w
S.Connect ((serverip, port))
OrflowerRor: Getsockaddrarg: Port musi być 0-65535.
  1. Poniższy błąd jest widoczny, jeśli „próbka.txt ”nie jest obecny po stronie klienta.

Traceback (najnowsze połączenie ostatnie):

Plik „Klient.py ", linia 25, w
plik = otwarty (”próbka.txt "," rb ")
FillenotFoundError: [errno 2] Brak takiego pliku lub katalogu: „próbka.tekst'

Wniosek:

Za pomocą tego programu możemy wysłać prosty plik tekstowy z jednego systemu do innego systemu za pośrednictwem sieci za pomocą programu Python. Daje nam to podstawowe uczenie się programowania Pythona i gniazda również do wysyłania danych przez sieć.