Pyton

Przesyłanie plików przez gniazdo w Pythonie

Przesyłanie plików przez gniazdo w Pythonie
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+.

Schemat podstawowej konfiguracji:

Oto podstawowy schemat konfiguracji do uruchomienia tego programu.

Dla uproszczenia w całym artykule nazwiemy System A jako A_client, a System B jako B_server.

Wymagania dotyczące plików:

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

Kolejne dwa pliki klient.py i próba.tekst 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:

Ograniczenia:

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

Skonfiguruj wymagania:

Kod źródłowy serwera:

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

Kod źródłowy klienta:

https://github.com/linuxhintcode/websamples/blob/master/python_send_file/klient.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 idź ścieżką, gdzie serwer.py jest obecny.

Krok 3: 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 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 klient.py i próbka.txt są obecne.

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

klient python3.py

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ść Klient [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: Powinna istnieć jedna nazwa pliku recv.txt w folderze na serwerze. Treść tego recv.txt powinien być tą samą próbką.tekst.

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

Objaśnienia kodu:

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

Pamiętaj, że wyjaśnimy raz, czy jakikolwiek kod jest taki sam na serwerze.py i klient.py.

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

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

Zrealizowaliśmy serwer.py lub klient.py jak Python3 <.py file name>. Teraz bez użycia python3 możemy uruchomić plik python. Postępuj zgodnie z poniższymi poleceniami

Przejdź do trybu superużytkownika:

su

Daj wszystkie uprawnienia do .plik py:

serwer chmod 777.py

Uruchom serwer.py:

./serwer.gniazdo importu py
Importowanie biblioteki gniazd do programu python, jak zamierzamy
użyć gniazda do połączenia.
s = gniazdo.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.bind((", 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ż to działa dobrze.

s.bind((adres IP, PORT))
plik = otwórz("odbierz.txt", "wb")

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

podczas gdy prawda:

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

conn, addr = s.zaakceptować()

Ten kod ma akceptować każde żądanie połączenia przychodzącego od klienta. Conn użyje „łączyć” komunikować się z klientem i „adres” to adres IP klienta, który wysłał żądanie zamieszania do tego serwera na porcie 9898.

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

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

łączyć.wyślij (wiadomość.kodować())

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

RecvData = poł.recv(1024)

Ten kod odbiera wszelkie dane wysyłane ze strony klienta. W naszym przypadku oczekujemy zawartości próbki.txt w „RecvData”.

natomiast RecvData:

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

plik.zapis(RecvData)

Gdy już mamy zawartość w środku „RecvData” wtedy piszemy do tego pliku „odbierz.tekst" za pomocą wskaźnika pliku "plik".

RecvData = poł.recv(1024)

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

plik.blisko()

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

łączyć.blisko()

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

złamać

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

  1. klient.py:
system importu

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

if (len(sys.argv) > 1):
IpSerwera = sys.argv[1]
jeszcze:
print("\n\n Uruchom jak \n klient python3.py < serverip address > \n\n")
wyjście(1)

Jak przekazujemy adres IP serwera B_ po nazwie pliku klient.py podczas pracy musimy przechwycić ten adres IP 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

To musi być ten sam port, o którym wspomniano po stronie B_server.

s.connect((ServerIp, PORT))

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

plik = otwórz("próbka.txt", "rb")

Otwieramy „próbkę”.txt” w trybie odczytu tylko do odczytu treści.

SendData = plik.przeczytaj(1024)

Odczytanie zawartości pliku i wstawienie do środka”Przesłać dane" zmienna.

podczas gdy SendData:

Zaczynamy jedną pętlę while, jeśli „Przesłać dane" ma dane. W naszym przypadku, jeśli „próbka”.txt” nie jest pusty, powinien zawierać dane.

s.wyślij (WyślijDane)

Teraz możemy wysyłać zawartość "próba.tekst" do serwera za pomocą obiektu gniazda „s”.

SendData = plik.przeczytaj(1024)

Ponownie czytam, jeśli coś zostało anything. Więc nie będzie nic do odczytania z pliku "Przesłać 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”, wiersz 22, w
s.connect((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Połączenie odrzucone
  1. Poniższy błąd pojawia się, 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 (ostatnie ostatnie połączenie):

Plik „klient.py”, wiersz 22, w
s.connect((ServerIp, PORT))
gniazdo elektryczne.gaierror: [Errno -2] Nieznana nazwa lub usługa
  1. Poniższy błąd jest widoczny, jeśli port jest używany jak 98980

Traceback (ostatnie ostatnie połączenie):

Plik „klient.py”, wiersz 22, w
s.connect((ServerIp, PORT))
OverflowError: getsockaddrarg: port musi mieć wartość 0-65535.
  1. Poniższy błąd jest widoczny, jeśli „próbka.txt” nie występuje po stronie klienta.

Traceback (ostatnie ostatnie połączenie):

Plik „klient.py”, wiersz 25, w
plik = otwórz("próbka.txt", "rb")
FileNotFoundError: [Errno 2] Brak takiego pliku lub katalogu: „sample”.tekst'

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 wysyłania danych przez sieć.

Gry Zremasterowane gry HD dla Linuksa, które nigdy wcześniej nie zostały wydane na Linuksa
Zremasterowane gry HD dla Linuksa, które nigdy wcześniej nie zostały wydane na Linuksa
Wielu twórców gier i wydawców wymyśla remaster HD starych gier, aby przedłużyć żywotność serii, prosimy fanów o kompatybilność z nowoczesnym sprzętem ...
Gry Jak używać AutoKey do automatyzacji gier Linux
Jak używać AutoKey do automatyzacji gier Linux
AutoKey to narzędzie do automatyzacji pulpitu dla systemów Linux i X11, zaprogramowane w Python 3, GTK i Qt. Korzystając ze skryptów i funkcji MAKRO, ...
Gry How to Show FPS Counter in Linux Games
How to Show FPS Counter in Linux Games
Linux gaming got a major push when Valve announced Linux support for Steam client and their games in 2012. Since then, many AAA and indie games have m...