python - 带有标头的Python套接字发布json请求
问题描述
我需要非常重要的时间(以毫秒为单位)并且需要非常快的发送后 json 请求套接字非常快我通过套接字发送数据但是在等待运行脚本之后没有响应
代码
import socket
import time
import ssl
start_time1 = time.time()
target_host = "site.com"
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
target_port = 443 # create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(( target_host,443 ))
s = context.wrap_socket(s,server_hostname=target_host)
request = "POST /api/send HTTP/1.1\r\nHost:site.com\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0\r\nCookie: .ASPXAUTH=D6CA254ED2327019933D1746092C47DD2884398658FF3DCAD213B8B9F0F73F7A67BC0C483F316F76195B49BC2C487783F9C73009B3469F1F7BCE6286C6C16A45916A013285E23808DED1C2F8E65262C377923823B538CFCC;\r\n{'IsSymbolCautionAgreement': 'false', 'CautionAgreementSelected': 'false', 'IsSymbolSepahAgreement': 'false', 'SepahAgreementSelected': 'false', 'orderCount': 112, 'orderPrice': 45150, 'FinancialProviderId': '1', 'minimumQuantity': '', 'maxShow': '0', 'orderId': '0', 'isin': 'IRO7NIRP0001', 'orderSide': '65', 'orderValidity': '74', 'orderValiditydate': 'null', 'shortSellIsEnabled': 'false', 'shortSellIncentivePercent': '0'}"
s.send(request.encode())
response = s.recv( 9999 )
s.close()
print request
print response + '\n'
print("--- %s seconds-total ---" % (time.time() - start_time1))
解决方案
由于缺乏对 HTTP 工作原理的了解,您的代码存在多个问题:
- 没有
Content-length
描述 HTTP 正文的长度 - HTTP 标头和正文之间没有适当的分隔符
- 并且您的代码隐式使用 HTTP keep-alive,但仍然错误地期望服务器在响应完成后立即关闭连接
我需要以毫秒为单位的非常重要的时间,并且需要非常快的发送后 json 请求套接字非常快
这是使用普通套接字而不是使用 HTTP 库的常用但通常错误的原因。开销不在于本地代码,而在于连接建立和数据传输,即网络 I/O 和网络延迟。与简单地使用套接字相比,已建立的库在保持相关开销较小方面做得更好:适当的库可以通过同一个 TCP 连接使用多个 HTTP 请求,可以使用压缩内容,可以处理 TLS 会话恢复等 - 所有这些都是与本地执行代码的复杂性相比,与性能更相关。
如果您仍然坚持运行自己的 HTTP 堆栈,那么请学习并遵循实际标准,而不是实现您自己对 HTTP 可能是什么样子的想法。
推荐阅读
- excel - 如何从过滤的搜索中分配单元格值?
- protractor - 基于自动单击按钮自动验证结果
- django - 发生反向访问器错误。它是什么,我该如何解决?
- react-native - info.plist 不保存所做的更改
- c# - 在 v4 Bot Framework Bot (C# + .Net Core Web 应用程序) 中显示欢迎消息
- python - %r 在格式字符串中做了什么?
- python - 从 [X] 和 [Y] 的单独列表中创建 [x, y] 点列表
- java - 未在 listcell 中设置位置
- oracle - PL/sql 函数返回多行错误
- c++ - 以排序方式插入节点时遇到问题