首页 > 解决方案 > 在 Python 中是否使用 http.client 或 Socket 包?

问题描述

我正在研究需要通过网络将加密数据发送到服务器的项目。我已经在互联网上搜索并检查了一些程序,但我对 http.client 和 Socket 这两个包感到困惑,我之前认为它们是同一回事。

我的代码中的几行 -

import http.client
.
.
ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
conn = http.client.HTTPSConnection(host="wwww.my_server.com", port=443, context=ctx)
headers = {'Content-type': 'application/json'}
json_data = json.dumps(System_info)
conn.request('POST', '/post', json_data, headers)

上述方法在没有证书的情况下有效,证书部分正在等待中。

我发现的另一种方法是使用 Sockets-

import Socket
.
.
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile=server_cert)
context.load_cert_chain(certfile=client_cert, keyfile=client_key)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn = context.wrap_socket(sock=s, server_side=False, do_handshake_on_connect=True, server_hostname=server_sni_hostname)
conn.connect((host_addr, host_port))

我能够在我的系统是客户端和服务器的系统上运行上述代码。

但是我想知道我应该使用什么,因为我想将数据发送到必须加密和安全的 NMS 服务器。

附加信息-

Os - Ubuntu 16
Python 3.5

标签: pythonlinuxsocketssslhttps

解决方案


您需要使用什么取决于您实际但未知的要求:http.client 或requests等库实现了 HTTP 协议,既适用于纯 HTTP,也适用于 TLS(即 HTTPS)。这些模块构建在套接字之上。

如果与您的特定服务器使用的应用程序协议是 HTTP/HTTPS,那么您可能会使用更高级别的库,例如 http.client 和 requests,但理论上您也可能会使用套接字。只是,使用普通套接字会使您实现起来更加复杂,并且与使用已建立的更高级别的库相比,它很可能不那么健壮并且需要更多时间来实现。

如果您的服务器不支持 HTTP/HTTPS,您需要使用普通套接字自己实现服务器所需的特定(我们不知道)协议,或者您需要找到一些已经实现服务器所需协议的库。在大多数情况下,后者是首选。


推荐阅读