スタックオーバーフローの他の投稿からこれはうまくいくはずです
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("www.cnn.com" , 80))
s.sendall("GET / HTTP/1.1\r\n")
print s.recv(4096)
s.close
しかし、何らかの理由で(recv
で)ハングし、印刷されません。 www.cnn.comへのリクエストがデータのチャンクになることは知っていますが、少なくともrecv
から何かを読み取る必要がありますよね?
pSこれが最良の方法ではないこと、そして
httplib
やurllib2
などのライブラリが世の中にあることは知っていますが、これらをこのプロジェクトに使用することはできません(学校用です)。socket
ライブラリを使用する必要があります
リクエスト行の後に空白行を送信するのを忘れました:
s.sendall("GET / HTTP/1.1\r\n\r\n")
さらに、HTTP 1.1は HTTP 1.1 RFCのHostセクション に記載されているHost
ヘッダーフィールドを追加する必要があることを指定しています。
s.sendall("GET / HTTP/1.1\r\nHost: www.cnn.com\r\n\r\n")
コードはほぼ正しいですが、HTTPプロトコルを満たすために2つの\r\n
シーケンスを送信する必要があります。
有効なGETリクエストは次のようになります(2行に注意してください)。
GET/HTTP/1.1
したがって、コードは次のようになります。
s.sendall('GET / HTTP/1.1\r\n\r\n')
さらに、Host:
など、有効なHTTP 1.1リクエストに必要な追加のヘッダーがあります。次のようなものをリクエストに追加する必要があります。
s.sendall('''GET / HTTP/1.1
Host: cnn.com
''')
みんなの時間を無駄にしてすみません。私はこの解決策を見つけました ここ スタックオーバーフローで(検索するために私のGoogle検索でいくつかの言い換えをしました)
import socket
request = b"GET / HTTP/1.1\nHost: www.cnn.com\n\n"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("cnn.com", 80))
s.send(request)
result = s.recv(10000)
while (len(result) > 0):
print(result)
result = s.recv(10000)
そして、すべての答えは、エンディングについても同様でした\r\n\r\n
ただし、返されたもの301
ステータス。この解決策はどういうわけかリダイレクトに従っているようです?とにかく、この解決策は私のために働いた
この行を置き換えてみてください:
_s.sendall("GET / HTTP/1.1\r\n")
_
と:
_s.sendall("GET / HTTP/1.1\r\n\r\n")
^^^^
_
また、_s.close
_は関数なので、s.close()
に置き換える必要があると思います。
Python 3.の例をクリーンアップしています。バイト/文字列変換が必要です。また、with
を使用して接続を自動的に閉じることもできます。
#!/usr/bin/env python3
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(("example.com" , 80))
s.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\nAccept: text/html\r\n\r\n")
print(str(s.recv(4096), 'utf-8'))
@james:気づかずにSlowLoris攻撃を行った。私はここよりよく説明することはできません https://www.youtube.com/watch?v=XiFkyR35v2Y 上記のすべての回答から解決策を見つけたと思いますが、これを持ってくるように答えましたあなたの知識に。 :)