Przechodzę przez książkę o nazwie "gwałtowny Python" i jest skrypt, który ciągnie dane FTP za pomocą modułu gniazda

>>> import socket
>>> socket.setdefaulttimeout(2)
>>> s = socket.socket()
>>> s.connect(("192.168.95.148",21)) 
>>> ans = s.recv(1024)
>>> print ans

Czy ktoś może wyjaśnić sekcję s = socket.socket()?

s.connect(("192.168.95.148",21)) Czy to jak mówienie:

socket.socket.(connect(("192.168.95.148",21)))

Po prostu zdezorientowany o zmiennej s i dlaczego należy stwierdzić dwa razy? Mam nadzieję, że ma sens i jestem pewien, że dotyczy to więcej niż tylko tej metody.

1
StackUser_py 13 sierpień 2014, 15:47

2 odpowiedzi

Najlepsza odpowiedź

socket() jest funkcją w bibliotece socket, więc gdy import socket i będziesz musiał użyć funkcji socket(), odwołujesz go przez socket.socket().

Alternatywnie, możesz zrobić, from socket import socket i do {x1}}

Z Doc,

Utwórz nowe gniazdo za pomocą podanej rodziny adresowej, typu gniazda i numeru protokołu. Rodzina adresowa powinna być af_inet (domyślna), af_inet6 lub af_unix. Typ gniazda powinien być sock_stream (domyślny), sock_dgram lub być może jedną z pozostałych stałych soków. Numer protokołu jest zwykle zero i może być pominięty w tym przypadku.

Kiedy to robisz s.connect(("192.168.95.148",21)) jest odpowiednik socket.socket().connect(("192.168.95.148",21)).

W twoim przypadku miałoby to sens, aby przypisać socket.socket() do s, jak używasz go wiele razy.

>>> s.connect(("192.168.95.148",21)) 
>>> ans = s.recv(1024)
>>> print ans

Koniecznie będzie lepszy niż,

>>> socket.socket().connect(("192.168.95.148",21)) 
>>> ans = socket.socket().recv(1024)
>>> print ans

Odkąd jesteś także programowaniem i w tym konkretnym kontekście, możesz spojrzeć na suche zasada. Proponowałbym również, aby przejść przez PEP8 Standardy dla dobrych praktyk kodujących.

Przejście krok dalej, jeśli masz wątpliwości co do funkcji lub oświadczenia, możesz użyć funkcji help.

Fragment help(socket):

Opis Ten moduł zapewnia operacje gniazd i niektóre pokrewne funkcje. W systemie UNIX obsługuje gniazda IP (protokol internetowy) i UNIX. W innych systemach obsługuje on tylko IP. Funkcje specyficzne dla gniazda są dostępne jako metody obiektu gniazda.

Functions:

socket() -- create a new socket object
socketpair() -- create a pair of new socket objects [*]
fromfd() -- create a socket object from an open file descriptor [*]
gethostname() -- return the current hostname
gethostbyname() -- map a hostname to its IP number
gethostbyaddr() -- map an IP number or hostname to DNS info
getservbyname() -- map a service name and a protocol name to a port number
getprotobyname() -- map a protocol name (e.g. 'tcp') to a number
ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
htons(), htonl() -- convert 16, 32 bit int from host to network byte order
inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
ssl() -- secure socket layer support (only available if configured)
socket.getdefaulttimeout() -- get the default timeout value
socket.setdefaulttimeout() -- set the default timeout value
create_connection() -- connects to an address, with an optional timeout and
                       optional source address.

Fragment help(socket.socket()):

|. Gniazdo ([Rodzina [, Typ [, Proto]]] -> Obiekt gniazda | Otwórz gniazdo podanego typu. Argument rodzinny określa | rodzina adresowa; domyślnie domyślnie do AF_INET. Argument typu określa | Niezależnie od tego, czy jest to strumień (Sock_stream, jest to domyślne) | lub gniazdo Datagram (Sock_dgram). Argument protokołu domyślnie do 0, | Określanie domyślnego protokołu. Argumenty słów kluczowych są akceptowane. |. Obiekt gniazdowy reprezentuje jeden punkt końcowy połączenia sieciowego.


Podsumowując, rozumialiśmy, że socket() jest funkcją, która tworzy nowy obiekt gniazdowy, a ta funkcja jest dostępna w bibliotece socket.

1
ComputerFellow 13 sierpień 2014, 12:16

Z Python Svn Trunk Socket.py Plik:

Funkcje:

Gniazdo () - Utwórz nowy obiekt gniazdowy

0
Wim Ombelets 13 sierpień 2014, 12:07