为什么SSLSocket这个socket子类没有create_connection方法?

1 投票
1 回答
1069 浏览
提问于 2025-04-18 12:19

Python的文档中提到:

ssl.wrap_socket(sock, keyfile=None, certfile=None, server_side=False, cert_reqs=CERT_NONE, ssl_version={见文档}, ca_certs=None, do_handshake_on_connect=True, suppress_ragged_eofs=True) 这个函数接收一个socket.socket的实例sock,并返回一个ssl.SSLSocket的实例。这个ssl.SSLSocket是socket.socket的一个子类,它会把底层的socket包裹在一个SSL的环境中。

但是当我尝试使用SSL socket的create_connection方法时,我收到了一个:

ssl_sock.create_connection(('www.google.com', 443))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'SSLSocket' object has no attribute 'create_connection'

1 个回答

1

create_connection() 是一个在 socket 模块里的函数,它的作用是创建一个新的套接字(socket),然后连接它,最后返回这个套接字1。在套接字对象上有一个叫 connect() 的方法,它接受和 create_connection() 一样的地址信息。

ssl_socket.connect(("...", 443))

不过,在 socket 模块的文档中,这两者很容易搞混。你需要注意你正在查看页面的哪个部分。套接字对象的方法只在 Socket Objects 这一部分能找到,而这些方法的前缀是 "socket.",这表示“属于 socket.socket 类型的方法”。这个前缀和模块里其他函数的 "socket." 前缀是一样的,后者表示“属于 socket 模块的函数”。

1当文档提到“套接字”时,它指的是在函数中创建的那个套接字,尽管文档里并没有明确说会创建一个套接字。

撰写回答