python - 在 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
解决方案
您需要使用什么取决于您实际但未知的要求:http.client 或requests等库实现了 HTTP 协议,既适用于纯 HTTP,也适用于 TLS(即 HTTPS)。这些模块构建在套接字之上。
如果与您的特定服务器使用的应用程序协议是 HTTP/HTTPS,那么您可能会使用更高级别的库,例如 http.client 和 requests,但理论上您也可能会使用套接字。只是,使用普通套接字会使您实现起来更加复杂,并且与使用已建立的更高级别的库相比,它很可能不那么健壮并且需要更多时间来实现。
如果您的服务器不支持 HTTP/HTTPS,您需要使用普通套接字自己实现服务器所需的特定(我们不知道)协议,或者您需要找到一些已经实现服务器所需协议的库。在大多数情况下,后者是首选。
推荐阅读
- mysql - 有没有办法确保对表架构的任何更改也适用于另一个表?
- python - 用于支持 Python Pandas 日期的凌乱 Excel 日期
- visual-studio - ScreenCaptureJob 未在 DEVOPS 中设置
- php - 我的视频没有显示说明请帮助我不是专家
- javascript - 从另一个组件调用函数
- angular - 使用 Angular-CLI 运行时设置节点选项
- powershell - [tag]已解决[/tag] 无法在 Powershell 命令中使用我的变量作为 Powershell Studio 中的 GUI
- python - 在条形堆栈图中标记和操作每个堆栈
- android - 如何从项目的strings.xml 列表中读取ViewModel 数据
- javascript - 如何在 html 日历中导入谷歌日历事件?