2017-05-23 5 views
0

私はPythonを学び始めました。私はこの本からこのコードを試していました。pythonソケットを持つすべてのページで404エラーを取得する

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() 

接続しようとしているWebページに関係なく、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> 
+0

'GET /code/romeo.txt HTTP/1.0 \ nHost:www.py4inf.com \ n \ n'を使ってみてください。 –

+0

それは働いていました!おかげで – jineps

答えて

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

あなたは、HTTPリクエストを送信しようとしているが、それと間違って複数のものがあります。他の人はちょうどこの特定のサーバーでは無視されますしながら、これらの原因の問題のいくつかは:

  • ラインエンドは、GET要求でパスがサーバーへの絶対URLが、相対的にすべきではないではない\n
  • \r\nする必要がありますすなわち/code/romeo.txtです。 Absoluteは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/1.1のためのシンプルなHTTP/1.0とRFC 2616のためのHTTPの標準、すなわちRFC 1945を勉強してください。

+0

これは動作します。ありがとう – jineps

関連する問題