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.pyNie powinno być żadnych błędów i powinieneś zobaczyć poniżej wydruki
Serwer jest notowany na porcie : 9898Skopiowana 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 skopiowanySerwer 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.
- serwer.py:
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:
jegoDaj wszystkie uprawnienia do pliku .py:
chmod777serwer.pyUruchom server.py:
./serwer.py import gniazdo elektryczneImportowaniegniazdo 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= 9898Teraz 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.
przerwaMa to wyjść z nieskończonej pętli while na B_server.
- klient.py:
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= 9898Musi 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:
- 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
- Poniższy błąd jest widoczny, jeśli adres IP nie jest przekazywany po stronie klienta
Biegnij jak
klienta Pythona3.py <adres IP serwera>- 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
- 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.
- 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ć.