我正在阅读一本名为“Violent Python”的书,并且有一个使用套接字模块提取FTP数据的脚本
>>> import socket
>>> socket.setdefaulttimeout(2)
>>> s = socket.socket()
>>> s.connect(("192.168.95.148",21))
>>> ans = s.recv(1024)
>>> print ans
有人可以解释s = socket.socket()
部分吗?
s.connect(("192.168.95.148",21))
是不是在说:
socket.socket.(connect(("192.168.95.148",21)))
只是对s
变量感到困惑,为什么需要两次说明?我希望这是有道理的,我相信这不仅适用于这种方法。
答案 0 :(得分:1)
socket()
是库socket
中的一个函数,因此当您import socket
并且需要使用socket()
函数时,您可以通过socket.socket()
引用它。
或者,您可以执行from socket import socket
并执行s = socket()
来自doc,
使用给定的地址系列,套接字类型和创建新套接字 协议号。地址族应该是AF_INET(默认值), AF_INET6或AF_UNIX。套接字类型应该是SOCK_STREAM( 默认),SOCK_DGRAM或者其他SOCK_常量之一。该 协议号通常为零,在这种情况下可以省略。
执行s.connect(("192.168.95.148",21))
时,它等同于socket.socket().connect(("192.168.95.148",21))
。
在您的情况下,将socket.socket()
分配给s
,因为您多次使用它是有意义的。
>>> s.connect(("192.168.95.148",21))
>>> ans = s.recv(1024)
>>> print ans
肯定会好过,
>>> socket.socket().connect(("192.168.95.148",21))
>>> ans = socket.socket().recv(1024)
>>> print ans
由于您还在学习编程,并且在此特定环境中,您可能希望查看DRY原则。我还建议您遵循PEP8标准,以获得良好的编码实践。
更进一步,如果您对功能或声明的作用有疑问,可以使用help
功能。
摘录自help(socket)
:
说明 该模块提供套接字操作和一些相关功能。 在Unix上,它支持IP(Internet协议)和Unix域套接字。 在其他系统上,它只支持IP。特定的功能 socket可用作套接字对象的方法。
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.
摘录自help(socket.socket())
:
| socket([family [,type [,proto]]]) - >套接字对象 |打开给定类型的套接字。 family参数指定了 |地址家庭;它默认为AF_INET。 type参数指定 |这是否是一个流(SOCK_STREAM,这是默认值) |或数据报(SOCK_DGRAM)套接字。 protocol参数默认为0, |指定默认协议。关键字参数被接受。 |套接字对象表示网络连接的一个端点。
总之,我们已经理解socket()
是一个创建新套接字对象的函数,这个函数在socket
库中可用。
答案 1 :(得分:0)
来自Python svn trunk socket.py文件:
功能:
socket() - 创建一个新的套接字对象