socket.connect()给出了socket.gaierror:[Errno 11004] getaddrinfo失败

时间:2016-11-03 10:28:36

标签: python

我已经检查了有关我的问题的答案,但我找不到有什么问题。我是Python的新手,这可能是个问题。我已经编写了这个简单的代码来连接到一个站点,但是我收到了这个错误:

  

socket.gaierror: [Errno 11004] getaddrinfo failed

这是我的代码:

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('http://www.py4e.com', 80))
mysock.send('GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n')
while True:
    data = mysock.recv(512)        
    if(len(data) < 1):
        break
    print (data)
mysock.close()

2 个答案:

答案 0 :(得分:1)

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4e.com', 80))
mysock.send('GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n')
while True:
    data = mysock.recv(512)        
    if(len(data) < 1):
        break
    print (data)
mysock.close()

非常简单,请勿在{{1​​}}的主持人声明中使用http:// .connect()协议http://主机(或DNS服务器中的A记录)。标准套接字库对协议一无所知,只需主机端口编号。
如果您想要自动化流程,请使用urllib.request检查Requests或@ Mego的答案,https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Client_request为您处理连接和HTTP解析。

此外,如果您使用的是www.py4e.com,那么您需要在执行Python3时发送bytes个数据。

将字符串转换为.send()数据的方法有两种:

bytes

两者基本上都是一样的。

最后,在mysock.send(b'GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n') mysock.send(bytes('GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n', 'UTF-8')) 请求中,您也不会请求GET 相反,您只需将路径发送到要检索的文件:

http://

原因是(再次)mysock.send(b'GET /code3/mbox-short.txt HTTP/1.0\n\n') 是协议描述符,而不是正在发送的实际协议数据的一部分。您在http://请求中也不需要主机声明,因为您连接到的服务器已经知道您所在的主机 - 因为您已...连接到它。
相反,如果主机为多个虚拟主机提供服务,则服务器希望您提供GET标头 您可能需要一些其他标题才能从某些Web服务器请求实际内容。

但这是事情的基本要点。

继续阅读

这是一个好的开始:

它会向您显示原始Host: <hostname>\r\n请求的内容 在将来,我建议使用内置的{{3}}浏览器,它可以显示原始标题,原始响应和一大堆其他内容。

答案 1 :(得分:-2)

我强烈建议您使用Requests module而不是直接处理套接字。

要安装Requests,只需在shell中运行以下命令(在Linux系统上需要sudo):

pip install requests

然后,您的代码就像:

一样简单
import requests
req = requests.get('http://www.py4e.com/code3/mbox-short.txt')
data = r.text
print(data)