Spisie treści
ten gniazda Są interfejsem, który pozwala nam komunikować się z dwoma lub więcej komputerami przez sieć. Dzięki temu możemy tworzyć różnego rodzaju aplikacje, które pomagają nam przesyłać dane przez Internet i tym samym widzieć wyniki, których inaczej byśmy nie mieli w czasie rzeczywistym.Jednym z najczęstszych sposobów implementacji gniazd jest protokół TCPDzięki temu przy wsparciu systemu operacyjnego transmisja przez Internet jest normalna i bezproblemowa.
Ponieważ trochę wiemy o podstawowej koncepcji, czym są gniazda, zaczniemy od manipulowania ich charakterystyką, jedną z nich jest czas oczekiwania.
Czas oczekiwaniaten czas oczekiwania Pozwala nam to ustalić, przez jaki czas gniazdo może zwracać uwagę na odbieranie lub wysyłanie danych, jest to bardzo ważne, ponieważ w przypadku zablokowania aplikacji w tym czasie możemy ponieść ryzyko spowolnienia całego systemu . Dlatego potrzebujemy wiedzieć, jaki jest z góry ustalony czas oczekiwania, a także być w stanie samodzielnie ustalić dla naszej wygody.
Aby to osiągnąć, możemy użyć kilku metod, które istnieją w tym celu w standardowej bibliotece gniazdo elektryczne z Pyton.
wygaśnięcie ()Pierwsza metoda to wygaśnięcie () i jak sama nazwa wskazuje, oferuje nam początkowy czas oczekiwania gniazda, który przekazujemy jako parametr.
przeterminowanie ()Druga metoda to przeterminowanie () a jego funkcjonalność polega na ustaleniu limitu czasu dla danego gniazda wyrażonego w milisekundach.
Stworzymy teraz mały program, który pozwoli nam wprowadzić w życie to, czego się nauczyliśmy, w tym celu najpierw utworzymy obiekt typu socket, który będzie służył jako nasz przedmiot testowy, w tym celu przekażemy rodzinę oraz typ gniazda do konstruktora i dzięki temu możemy zastosować metody.
Aby zobaczyć zmiany po utworzeniu naszego gniazda wypiszemy jego czas oczekiwania, który musi być pusty, ponieważ jest to nowy obiekt, a następnie metodą przeterminowanie () Ustalimy nowy czas oczekiwania i na koniec wydrukujemy informację, potwierdzając tym samym, że wszystko działało jak należy.
Aby to wszystko osiągnąć, musimy upewnić się, że mamy: Pyton zainstalowany w naszym systemie, w swojej wersji 2.7, oraz posiadamy edytor tekstu, aby móc tworzyć pliki z programami, choć ćwiczenie możemy też wykonać na konsoli, jednak jest to nieco bardziej niewygodne i nie jest uporczywe, co oznacza, że stracilibyśmy pracę. Spójrzmy na kod źródłowy tego przykładu:
#! / usr / bin / env python import socket def timeout_socket (): s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) print "Początkowy limit czasu to:% s"% s.gettimeout () s. settimeout (100 ) print "Nowy limit czasu to:% s"% s.gettimeout () if __name__ == '__main__': time_out_socket ()
Zapiszemy to w nowym pliku o nazwie socketTimeWait.py i wykonamy go w konsoli, wynik powinien być podobny do następującego:
ten bufor To kolejna z rzeczy, które musimy wziąć pod uwagę pracując z gniazdami, ponieważ ten komponent będzie tym, który wskaże ilość danych, które możemy w danej chwili przesłać, aby więcej bufora Im większa ilość danych, ale oznacza to również większe zużycie zasobów i dłuższy czas oczekiwania na ich przesłanie. W przeciwnym razie a dolny bufor Reprezentuje większą prędkość, chociaż ogranicza ilość przesyłanych danych, dlatego jest to umiejętność, którą musimy opanować.
setsockopt ()Aby pomóc nam manipulować buforem biblioteki gniazdo elektryczne z Pyton oferuje nam metodę setoopt(), które musimy zastosować do instancji klasy socket. Jeśli chcemy zmienić rozmiar bufora, z pewnością musimy najpierw znać oryginalny rozmiar bufora gniazda, do tego również mamy metodę getockopt () i jest używany w podobny sposób jak metoda, którą opisaliśmy powyżej.
Zamierzamy stworzyć mały program, aby zademonstrować to, co wyjaśniliśmy wcześniej, w kodzie, który zobaczymy, do którego najpierw przejdziemy utwórz parę stałych których będziemy używać w naszym programie i zostaną zdefiniowane do 4096 co jest wartością rozmiaru buforów, które ustalimy.
Następnie tworzymy instancję klasy socket, aby od razu zapytać o początkowe rozmiary bufora, po czym wypisujemy je na ekranie.
Na koniec użyjemy metody setsockopt () Aby ustawić żądany rozmiar bufora za pomocą stałych zdefiniowanych na początku programu, metoda ta otrzymuje trzy parametry, poziom, nazwę i na końcu wartość bufora.
Zobaczmy kod, który pomoże nam określić to, co wyjaśniliśmy, zapiszemy to w pliku o nazwie size_buffer.py:
#! / usr / bin / env python import socket TAM_BUFFER_SEND = 4096 TAM_BUFFER_RECEPCION = 4096 def manipulate_buffer (): sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # Pobierz rozmiar bufora wysylania gniazda = rozmiarBufferopt (socket.SOL_SOCKET, socket.SO_SNDBUF) print "Rozmiar bufora [przed]:% d"% Rozmiar bufora sock.setsockopt (socket.SOL_TCP, socket.TCP_NODELAY, 1) sock.setsockopt (socket.SOL_SOCKET, socket.SO_SNock.DBUFFER_ setsockopt (socket.SOL_SOCKET, socket.SO_RCVBUF, SIZE_BUFFER_RECEPCION) buffersize = sock.getsockopt (socket.SOL_SOCKET, socket.SO_SNDBUF) print "Rozmiar bufora [po]:% d"% manipuluj_rozmiar_bufora 'bufor_rozmiar =__bufor = __bufor =' __ ()
Po napisaniu naszego programu przystąpimy do wykonywania go w konsoli i zobaczymy, że otrzymujemy wartości bufora przed i po modyfikacji jego rozmiaru.
Podobnie jak w przypadku wszystkich typów programów, podczas pracy z gniazdami nie jesteśmy zwolnieni z napotkania niektórych błędów, problemem, którego musimy unikać, jest to, że te błędy nas zaskakują, ponieważ jeśli tak, nasza aplikacja może działać nieprzewidywalnie.
Dlatego musimy nauczyć się radzić sobie z błędami, w ten sposób w przypadku nieoczekiwanej sytuacji nasz program nie umiera ale powiadamia nas, że coś się stało, dzięki temu unikniemy uszkodzenia danych lub podobnych sytuacji, które wpływają na stabilność naszego Programu.
Jak sobie z tym poradzić?Osiągamy to za pomocą klocków spróbuj - z wyjątkiem które pozwalają nam oceniać sytuacje, na ogół obejmujące dane poza naszą kontrolą i dzięki temu możemy działać w scenariuszach zgodnie z otrzymanymi odpowiedziami. Jeśli wpadniemy w sekcję z wyjątkiem bloku możemy użyć właściwości error naszej instancji i wraz z nią wydrukować, co się stało, a tym samym wiedzieć, na czym polega awaria.
W poniższym programie przetestujemy to, co zdefiniowaliśmy podczas wyjaśniania. Przede wszystkim stworzymy blok, który będzie nas kontrolował, jeśli podczas tworzenia gniazda wystąpił błąd, czy nie, dzięki temu możemy zapewnić dobry początek naszego kodu.
Następnie ocenimy połączenie naszej aplikacji ze zdalnym hostem przez określony port i z obsługą błędów możemy zdefiniować niestandardowy komunikat. Na koniec wywołujemy naszą funkcję i za jej pomocą wykonamy opisane akcje.
Zobaczmy następujący kod, który musimy przechowywać w pliku o nazwie error_socket.py a potem uruchomimy go w konsoli:
#! / usr / bin / env python import sys import socket host = 'http: //python.orgt' port = '06' def error_handling (): try: s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) z wyjątkiem socket.error, e: print "Wystąpił błąd podczas tworzenia gniazda:% s"% e sys.exit (1) try: s.connect ((host, port)) z wyjątkiem socket.gaierror, e: print "Błąd w adresie połączenia:% s "% e sys.exit (1) z wyjątkiem socket.error, e: print" Błąd połączenia:% s "% e sys.exit (1) if __name__ == '__main__': error_handling ()
Tutaj widzimy, że korzystaliśmy z biblioteki system aby skorzystać z metody Wyjście () i zamknij program po wystąpieniu błędu. Zwracamy również uwagę, że host jest niepoprawny, dzięki czemu możemy wymusić błąd, a tym samym zobaczyć komunikat na ekranie. Na koniec zauważamy, że używamy zmiennej e do przechwycenia błędu gniazda, dzięki czemu możemy uzyskać prawdziwe szczegóły tego, co się stało.
PamiętaćTutaj musimy być szczególnie ostrożni z wcięcie kodu pamiętaj, że Pyton Nie używając nawiasów klamrowych, średniki również do definiowania zamknięć bloków zależą wyłącznie od spacji lub tabulatorów, których używamy, więc jeśli nie zrobimy tego poprawnie, zobaczymy błędy składni.
Bardzo ważne jest, abyśmy zapoznali się z dokumentacją Biblioteka gniazd Pythona dzięki czemu możesz znaleźć więcej i lepszych sposobów na wykorzystanie swoich zasobów.
Na tym kończymy ten samouczek, zdaliśmy sobie sprawę, jak Pyton posiada bardzo łatwe do zrozumienia narzędzia, które dają nam dostęp do świata gniazdaDzięki temu możemy zacząć programować aplikacje korzystające z sieci do wykonywania przetwarzania w czasie rzeczywistym, np. pozyskiwania informacji z innych maszyn w sieci lub nawet z Internetu.Podobał Ci się i pomógł ten samouczek?Możesz nagrodzić autora, naciskając ten przycisk, aby dać mu pozytywny punkt