关于so​​cket.socket()的澄清

时间:2014-08-13 11:47:21

标签: python

我正在阅读一本名为“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变量感到困惑,为什么需要两次说明?我希望这是有道理的,我相信这不仅适用于这种方法。

2 个答案:

答案 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() - 创建一个新的套接字对象