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:
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/Server.py
Kod źródłowy klienta:
https: // github.com/LinuxhintCode/WebSamples/Blob/Master/Python_Send_file/Client.py
#!/usr/bin/env python3Jak 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.pyZauważ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.
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.pyGniazdo importu
Tworzymy obiekt "S" Aby uzyskać dostęp do wszystkich metod gniazda. To jest koncepcja OOPS.
Port = 9898Teraz 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))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: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.
przerwaTo ma wyjść z Infinite podczas pętli w B_Server.
Importowanie biblioteki SYS, ponieważ chcemy używać zakładu argumentów w Python.
if (len (sys.argv)> 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 = 9898To 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:
Zaleceniem jest użycie dwóch systemów Linux dla serwera i klienta.
Traceback (najnowsze połączenie ostatnie):
Plik „Klient.py ", wiersz 22, w
S.Connect ((serverip, port))
ConnectionRefusedError: [errno 111] Connection odmówił
Biegnij jak
Klient Python3.py < serverip address >
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
Traceback (najnowsze połączenie ostatnie):
Plik „Klient.py ", wiersz 22, w
S.Connect ((serverip, port))
OrflowerRor: Getsockaddrarg: Port musi być 0-65535.
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'
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ć.