Przesyłanie plików przez gniazdo w Pythonie

Python Socket File Transfer Send



Intencją tego artykułu jest nauka jak przesłać plik tekstowy przez sieć za pomocą programu python . Ten transfer plików jest oparty na modelu klienta serwera do korzystania z programowania gniazd w python3+.

Oto podstawowy schemat konfiguracji do uruchomienia tego programu.









Dla uproszczenia będziemy nazywać System A jako A_client i System B jako B_server w całym artykule.



Wymagania dotyczące plików:

Potrzebujemy serwer.py i ten plik powinien być obecny w systemie serwera. W naszym przypadku server.py powinien znajdować się w systemie B_server.





Kolejne dwa pliki klient.py oraz przykład.txt powinien być obecny w systemie klienta. W naszym przypadku te dwa pliki powinny znajdować się w systemie A_client.

Założenia:

Oto założenia:



  • Powinniśmy mieć dwa systemy Linux z dostępem terminalowym.
  • Preferowany smak Linuksa to Ubuntu .
  • Powinien być zainstalowany Python3.
  • Oba systemy Linux powinny mieć możliwość pingowania się nawzajem. Posługiwać się świst polecenie, aby sprawdzić ping.
  • Jeden system powinien działać jako serwer, a drugi jako klient w określonym czasie.

Ograniczenia:

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

  • Aby uruchomić ten program, należy zainstalować Python3+. Możesz zaobserwować błąd lub inne zachowanie, jeśli działasz na starszych wersjach Pythona.
  • Od teraz za pomocą tego programu można przesyłać tylko plik tekstowy. Każdy inny format pliku, który nie zawiera tekstu, może się nie powieść.
  • W programie obsłużono podstawowe wyjątki programistyczne.
  • Program może, ale nie musi działać na innym systemie operacyjnym niż Ubuntu.
  • Plik tekstowy powinien być krótki po stronie klienta, ponieważ użyto bufora o rozmiarze 1024 bajtów.

Skonfiguruj wymagania:

  • Aby wypróbować ten program, potrzebujemy co najmniej jednego systemu Linux. Ale zaleca się użycie dwóch różnych systemów Linux, które są połączone przez sieć.
  • Dwa systemy powinny być połączone przez Ethernet lub Wi-Fi lub inne połączenia.

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

Jak uruchamiać programy i oczekiwane wyniki:

Oto kroki, aby wykonać program.

Krok 1: Przejdź do systemu B_server i otwórz terminal. Skrót do otwarcia terminala to Alt+Ctrl+T.

Krok 2: Teraz przejdź do ścieżki, w której znajduje się server.py.

Krok 3: Teraz uruchom server.py jak poniżej

serwer Pythona3.py

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

Serwer jest notowany na porcie : 9898

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

Krok 4: Teraz otwórz terminal w systemie A_client.

Krok 5: Przejdź do ścieżki, w której znajdują się client.py i sample.txt.

Krok 6: Teraz uruchom client.py jak poniżej

klienta Pythona3.py <B_systemowy adres IP serwera>

Zaobserwowaliś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 wyglądać tak

################## Poniższa wiadomość została odebrana z serwera ##################
|--------------------------------- |
Cześć kliencie[Adres IP: 192.168.1.102],
**Witamy na serwerze**
-Serwer
|--------------------------------- |

Krok 7: Teraz przejdź do B_server i poszukaj poniżej danych wyjściowych

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

Krok 8: W folderze serwera powinien znajdować się jeden plik o nazwie recv.txt. Zawartość tego recv.txt powinna być taka sama: sample.txt.

Więc pomyślnie skopiowaliśmy plik z klienta na serwer przez sieć za pomocą programu python.

Objaśnienia kodu:

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

Zauważ, że wyjaśnimy raz, czy jakikolwiek kod jest taki sam w server.py i client.py.

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

To jest linia shebang, co oznacza, że ​​domyślnie ten server.py powinien używać python3. Zobaczmy jedną zaletę tej linii.

Uruchomiliśmy server.py lub client.py jak Python3 . Teraz bez użycia python3 możemy wykonać plik Pythona. Postępuj zgodnie z poniższymi poleceniami

Przejdź do trybu superużytkownika:

jego

Daj wszystkie uprawnienia do pliku .py:

chmod777serwer.py

Uruchom server.py:

./serwer.py import gniazdo elektryczne
Importowaniegniazdo elektrycznebiblioteka do programu pythonjakidziemy
używaćgniazdo elektryczne dlapołączenie.

s = gniazdo elektryczne.gniazdo elektryczne()

Tworzymy obiekt s aby uzyskać dostęp do wszystkich metod gniazda. To jest koncepcja OOP.

PORT= 9898

Teraz wybieramy jeden port, na którym serwer będzie nasłuchiwał. Zamiast tego możemy użyć niezarezerwowanego portu.

s.wiązać(('',PORT))

Używamy metody bind, aby powiązać adres IP serwera z tym portem [9898]. Jedną z obserwacji jest to, że mogliśmy użyć dokładnego adresu IP serwera zamiast pierwszego argumentu metody wiązania, ale pozostawiamy puste, ponieważ działa to dobrze.

s.wiązać((adres IP,PORT))
plik = otwarty('odbiór.txt', „wb”)

Otworzyliśmy jeden plik o nazwie recv.txt na serwerze dla trybu zapisu i otrzymaliśmy wskaźnik pliku. Jest to wymagane, ponieważ musimy skopiować jeden plik tekstowy od klienta.

podczas Prawdziwe:

Zacznijmy jedną nieskończoną pętlę while, ponieważ zadaniem serwera jest czekanie, aż klient skomunikuje się z serwerem na tym porcie 9898. Więc ta pętla while jest wymagana.

łączyć,addr=s.zaakceptować()

Ten kod służy do akceptowania wszelkich przychodzących żądań połączenia od klienta. Conn użyje łączyć komunikować się z klientem i addr to adres IP klienta, który wysłał żądanie zamieszania do tego serwera na porcie 9898.

msg= ' |--------------------------------- | Witaj kliencie [adres IP:
'
+ adres[0]+'], **Witamy na serwerze** -Serwer
|--------------------------------- | '

Ten kod ma na celu stworzenie wiadomości do wysłania do klienta. Ten komunikat powinien być wydrukowany na terminalu klienta. Potwierdza to, że klient jest w stanie komunikować się z serwerem.

poł.wysłać(wiad.kodować())

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

Odzyskiwanie danych=poł.Odbierz(1024)

Ten kod odbiera wszelkie dane wysyłane ze strony klienta. W naszym przypadku spodziewamy się zawartości pliku sample.txt w Odzyskiwanie danych .

podczasOdzyskiwanie danych:

Jeszcze jedna pętla while z warunkiem RecvData nie jest pusta. W naszym przypadku nie jest pusty.

plik.pisać(Odzyskiwanie danych)

Gdy już mamy zawartość w środku Odzyskiwanie danych wtedy piszemy do tego pliku recv.txt za pomocą wskaźnika pliku plik.

Odzyskiwanie danych=poł.Odbierz(1024)

Ponownie próbuję odebrać, jeśli są jakieś dane od klienta. Pewnego razu Odzyskiwanie danych nie ma danych, kod przerwie pętlę while.

plik.blisko()

To po prostu zamknie wskaźnik pliku, tak jak skończyliśmy z zapisem do pliku.

poł.blisko()

Spowoduje to zamknięcie połączenia z klientem.

przerwa

Ma to wyjść z nieskończonej pętli while na B_server.

  1. klient.py:
import system

Importowanie biblioteki sys, jak chcemy, użyj argumentu w pythonie.

Jeśli (len(system.argv) > 1):
IP serwera= system.argv[1]
w przeciwnym razie:
wydrukować(' Biegnij jak python3 klient.py ')
Wyjście(1)

Ponieważ przekazujemy adres IP serwera B_server po nazwie pliku client.py podczas działania, musimy przechwycić adres IP tego serwera wewnątrz klienta.

…..if (len(sys.argv) > 1): => Aby upewnić się, że użytkownik przekazuje co najmniej jeden argument jako adres IP i przechwytuje ten adres IP insdie IP serwera.

Jeśli użytkownik nie przekaże co najmniej jednego argumentu kod pokazuje pomoc i wychodzi z kodu.

PORT= 9898

Musi to być ten sam port, o którym wspomniano po stronie B_server.

s.łączyć((IP serwera,PORT))

Ten kod wykona połączenie TCP do IP serwera z tym portem. Wszystko, co jest nie tak na tym punkcie, skutkuje niepowodzeniem w połączeniu.

plik = otwarty('przykład.txt', „rb”)

Otwieramy plik sample.txt w trybie odczytu, aby tylko czytać zawartość.

Wyślij dane= plik.czytać(1024)

Czytanie zawartości pliku i wstawianie do środka Wyślij dane zmienny.

podczasWyślij dane:

Zaczynamy jedną pętlę while, jeśli Wyślij dane ma dane. W naszym przypadku, jeśli plik sample.txt nie jest pusty, powinien zawierać dane.

s.wysłać(Wyślij dane)

Teraz możemy wysyłać zawartość przykład.txt do serwera za pomocą obiektu gniazda s.

Wyślij dane= plik.czytać(1024)

Jeszcze raz czytam, czy coś zostało. Więc nie będzie nic do odczytania z pliku Wyślij dane będzie pusty i wyjdzie z pętli while.

s.blisko()

To nie jest zamknięcie połączenia od strony klienta.

Zrzuty ekranu Ubuntu po stronie serwera

Zrzuty ekranu Ubuntu po stronie klienta

Testowane kombinacje:

  • Linux jako serwer i Linux jako klient: PASS
  • Linux jako klient i Linux jako serwer: PASS
  • Linux jako serwer i Windows10 jako klient: PASS
  • Linux jako klient i Windows10 jako serwer: PASS

Zaleca się użycie dwóch systemów Linux dla serwera i klienta.

Oczekiwane błędy:

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

Traceback (ostatnie ostatnie połączenie):

Plik„klient.py”,linia22, w <moduł>
s.łączyć((IP serwera,PORT))
Błąd odmowy połączenia:[Errno111]Połączenie odrzucone
  1. Poniższy błąd jest widoczny, jeśli adres IP nie jest przekazywany po stronie klienta

Biegnij jak

klienta Pythona3.py <adres IP serwera>
  1. Poniższy błąd jest widoczny, jeśli 1NSargument po stronie klienta nie jest adresem IP

Traceback (ostatnie ostatnie połączenie):

Plik„klient.py”,linia22, w <moduł>
s.łączyć((IP serwera,PORT))
gniazdo elektryczne.gaierror:[Errno -2]Nazwalubusługanieznany
  1. Poniższy błąd jest widoczny, jeśli port jest używany jak 98980

Traceback (ostatnie ostatnie połączenie):

Plik„klient.py”,linia22, w <moduł>
s.łączyć((IP serwera,PORT))
Błąd przepełnienia: getsockaddrarg: port musi być0-65535.
  1. Poniższy błąd jest widoczny, jeśli plik sample.txt nie jest obecny po stronie klienta.

Traceback (ostatnie ostatnie połączenie):

Plik„klient.py”,linia25, w <moduł>
plik = otwarty('przykład.txt', „rb”)
Błąd pliku nie znalezionego:[Errno2]Nie ma takiegoplik lubinformator:'przykład.txt'

Wniosek:

Za pomocą tego programu możemy przesłać prosty plik tekstowy z jednego systemu do drugiego przez sieć za pomocą programu python. Daje nam to podstawową naukę programowania w Pythonie i gniazdach, również do przesyłania danych przez sieć.