【问题标题】:Getting 404 error for every page with python socket使用 python 套接字为每个页面获取 404 错误
【发布时间】:2017-05-23 21:00:44
【问题描述】:

我开始学习python。我正在尝试书中的这段代码。

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    mysock.connect(('www.py4inf.com', 80))
    mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')

except Exception as e:
    print(e)


try:
    while True:
        data = mysock.recv(512)
        if ( len(data) < 1 ) :
            break
        print data  
except Exception as e:
    print(e)

mysock.close()

无论我尝试连接哪个网页,我都会收到 404 错误。 运行代码时得到以下信息。

HTTP/1.1 404 Not Found
Server: nginx
Date: Tue, 23 May 2017 17:54:54 GMT
Content-Type: text/html
Content-Length: 162
Connection: close

<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>

【问题讨论】:

  • 尝试使用GET /code/romeo.txt HTTP/1.0\nHost: www.py4inf.com\n\n
  • 成功了!谢谢

标签: python-2.7 sockets http-status-code-404 port


【解决方案1】:
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')

您正在尝试发送 HTTP 请求,但它存在多个问题。其中一些会导致问题,而另一些则会被此特定服务器忽略:

  • 行尾应该是\r\n 而不是\n
  • GET 请求中的路径不应是绝对 URL,而是相对于服务器的路径,即/code/romeo.txt。 HTTP/1.1 可以接受绝对值,但您使用 HTTP/1.0。
  • 服务器使用虚拟主机,即同一 IP 地址上的多个主机名。因此,您必须使用 Host 标头指定要访问的主机。

在这种情况下,最后一项实际上是最重要的,但其他点也应该固定。因此正确的请求应该是这样的

mysock.send('GET /code/romeo.txt HTTP/1.0\r\nHost: www.py4inf.com\r\n\r\n')

有关更多信息,请研究 HTTP 标准,即RFC 1945 用于更简单的 HTTP/1.0,RFC 2616 用于更复杂但在实践中更常用的 HTTP/1.1。

【讨论】:

    【解决方案2】:

    尝试更改此行mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n') 改用此行mysock.connect(('www.py4inf.com', 80)) mysock.send('GET /code/romeo.txt HTTP/1.0\nHost:www.py4inf.com\n\n'.encode())

    连接应该是这样的:

    import socket mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) mysock.connect(('www.py4inf.com', 80)) mysock.send('GET /code/romeo.txt HTTP/1.0\nHost:www.py4inf.com\n\n'.encode())

    while True:
        data = mysock.recv(512)
        if (len(data) < 1):
            break
        print(data.decode(),end='')
    
    mysock.close()
    

    【讨论】:

    • 请在您的回答中添加一些解释。
    【解决方案3】:

    我在这里为您进行了更改,希望这会有所帮助:

    Ps:也在第19行Print (data),否则你会得到SyntaxError

    import socket
    
    mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    try:
        mysock.connect(('www.py4inf.com', 80))
        #mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')
        mysock.send('GET /code/romeo.txt HTTP/1.0\nHost:www.py4inf.com\n\n'.encode())
    
    except Exception as e:
        print(e)
    
    
    try:
        while True:
            data = mysock.recv(512)
            if ( len(data) < 1 ) :
                break
            print (data)  
    except Exception as e:
        print(e)
    
    mysock.close()
    

    【讨论】:

      猜你喜欢
      • 2019-04-07
      • 1970-01-01
      • 2011-11-24
      • 2016-01-18
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2016-06-28
      相关资源
      最近更新 更多