【问题标题】:Python can't receive user data in HTTP socket serverPython 无法在 HTTP 套接字服务器中接收用户数据
【发布时间】:2017-10-01 21:03:05
【问题描述】:

我无法在 recv() 中获取数据 我想要用户在表单字段中输入的数据

代码:

def recvall(self, conn):
    BUFF_SIZE = 4096 # 4 KiB
    data = ""

    while True:

        packet = conn.recv(BUFF_SIZE).decode('utf-8')
        data += packet

        if len(packet) < BUFF_SIZE:
            break

    print (data)

输出:

POST /search HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 14
Cache-Control: max-age=0
Origin: http://localhost
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://localhost/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8

似乎缺少一行或什么我已经尝试了一切 我想要最后的数据

【问题讨论】:

  • 这似乎是一个奇怪的终止条件:if len(packet) &lt; BUFF_SIZE: break。你想在那里实现什么目标?
  • 我试过了:if not packet: break 但它一直在循环,所以我就这么做了,它成功了
  • 如果您真的想实现自己的 HTTP 堆栈,请阅读standard 而不是仅仅猜测。 HTTP 请求由一个标头和一个可选的主体组成,由新行分隔,主体的大小在标头中给出。你不能仅仅使用愚蠢的recv 来希望你得到一切,但你必须真正正确地处理 HTTP 协议。

标签: python sockets http header recv


【解决方案1】:

Steffen 正确观察到标题序列后,您已停止阅读。以下代码应该可以工作(注意,未经测试!):

def recvall(self, conn):
    BUFF_SIZE = 4096

    while True:
        packet = conn.recv(BUFF_SIZE)
        if not packet:
            break
        print packet.decode('utf-8')

【讨论】:

  • 它一直在循环,不会中断
  • @OmarAlhussani 我修改了代码以立即输出。看看它给了你什么。我的猜测是客户端不会终止连接。
猜你喜欢
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多