从堆栈溢出的其他帖子来看,这应该是有效的
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
但由于某种原因,它只是挂起(at recv
)并且从不打印.我知道对www.cnn.com的请求会将数据分块,但我至少应该从中读取一些内容recv
,对吧?
PS我知道这是不是做到这一点的最好办法,而且有像库
httplib
和urllib2
在那里,但我不能使用那些为这个项目(这是学校).我必须使用该socket
库
Takis.. 14
您忘记在请求行后发送空行:
s.sendall("GET / HTTP/1.1\r\n\r\n")
此外,HTTP 1.1指定您应该添加Host
标头字段,如HTTP 1.1 RFC中的Host部分所述.
s.sendall("GET / HTTP/1.1\r\nHost: www.cnn.com\r\n\r\n")
mhawke.. 5
您的代码几乎是正确的,但您需要发送2个\r\n
序列以满足HTTP协议.
有效的GET请求将如下所示(注2行):
GET / HTTP/1.1
所以你的代码应该是:
s.sendall('GET / HTTP/1.1\r\n\r\n')
此外,有效的HTTP 1.1请求还需要额外的标头,例如Host:
.您需要将它们添加到您的请求中,如下所示:
s.sendall('''GET / HTTP/1.1 Host: cnn.com ''')
james smith.. 5
很抱歉浪费大家的时间。我刚刚发现这个解决方案在这里对堆栈溢出(只是把我在谷歌的一些措词搜索找到)
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\r\n")
此外,HTTP 1.1指定您应该添加Host
标头字段,如HTTP 1.1 RFC中的Host部分所述.
s.sendall("GET / HTTP/1.1\r\nHost: www.cnn.com\r\n\r\n")
您的代码几乎是正确的,但您需要发送2个\r\n
序列以满足HTTP协议.
有效的GET请求将如下所示(注2行):
GET / HTTP/1.1
所以你的代码应该是:
s.sendall('GET / HTTP/1.1\r\n\r\n')
此外,有效的HTTP 1.1请求还需要额外的标头,例如Host:
.您需要将它们添加到您的请求中,如下所示:
s.sendall('''GET / HTTP/1.1 Host: cnn.com ''')
很抱歉浪费大家的时间。我刚刚发现这个解决方案在这里对堆栈溢出(只是把我在谷歌的一些措词搜索找到)
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
状态是正确的。此解决方案似乎以某种方式遵循重定向?无论如何,这个解决方案对我有用