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:
- 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 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.
- 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 plik formatu, 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 dowolne inne połączenia.
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.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 klient.py i próbka.txt są obecne.
Krok 6: Teraz uruchom klienta.py jak poniżej
klient python3.pyZaobserwowaliś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 skopiowanySerwer 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.
- serwer.py:
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:
suDaj wszystkie uprawnienia do .plik py:
serwer chmod 777.pyUruchom serwer.py:
./serwer.gniazdo importu pyImportowanie 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 = 9898Teraz 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.
- klient.py:
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 = 9898To 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:
- 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, ws.connect((ServerIp, PORT))
ConnectionRefusedError: [Errno 111] Połączenie odrzucone
- Poniższy błąd pojawia się, jeśli adres IP nie jest przekazywany po stronie klienta
Biegnij jak
klient python3.py < serverip address >- 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, ws.connect((ServerIp, PORT))
gniazdo elektryczne.gaierror: [Errno -2] Nieznana nazwa lub usługa
- Poniższy błąd jest widoczny, jeśli port jest używany jak 98980
Traceback (ostatnie ostatnie połączenie):
Plik „klient.py”, wiersz 22, ws.connect((ServerIp, PORT))
OverflowError: getsockaddrarg: port musi mieć wartość 0-65535.
- 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, wplik = 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ć.