【问题标题】:Python problem with sockets套接字的Python问题
【发布时间】:2011-03-01 21:37:45
【问题描述】:

我正在做一个涉及套接字的简单项目。有点像telnet。我只是希望它连接到端口 80 并执行 GET / 这是我正在尝试的:


import socket
size = 100000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "localhost"
port = 80
s.connect((host, port))
stuff = "GET /"
s.send(stuff)
r = s.recv(size)
print(r)
我运行它,它连接但我没有得到 GET / 的输出

【问题讨论】:

  • 你试过GET / HTTP/1.1吗? RFC2616 似乎需要 Request-Line 中的协议版本

标签: python http sockets


【解决方案1】:

HTTP 规范说您需要在标头后添加两个换行符 ('\r\n' * 2)。试试:

stuff = 'GET /\r\n\r\n'

【讨论】:

    【解决方案2】:

    GET / 之后至少需要一个空行,因此请使用stuff = "GET /\n\n"。阅读this example

    【讨论】:

      【解决方案3】:

      您的主要问题是“GET /”之后缺少换行符。 HTTP 协议需要换行符,因此服务器正在等待它,这就是您等待响应的原因。

      (一个小问题是你的缓冲区太大了,Python socket 模块推荐 2 的小幂,比如 4096。)

      我建议:

      import socket
      size = 4096
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      host = "localhost"
      port = 80
      s.connect((host, port))
      stuff = "GET /\n"
      s.send(stuff)
      buf = ''
      while True:
          r = s.recv(size)
          if not r: break
          buf += r
      
      print(buf)
      

      最后的循环确保您将获得整个响应。

      最后,我推荐 urllib2,它为您实现了 HTTP 并避免了此类错误:

      import urllib2
      print(urllib2.urlopen('http://localhost').read())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-04
        • 1970-01-01
        • 2011-07-28
        • 2011-07-09
        • 1970-01-01
        • 2020-02-04
        • 1970-01-01
        相关资源
        最近更新 更多