为什么python套接字无法解析带有http的网址 - python

我的脚本基本上看起来像这样

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('http://goal.com', 80))

我遇到这样的错误

Traceback (most recent call last):
  File "/home/danidee/PycharmProjects/b&h/dang.py", line 4, in <module>
    s.connect(('http://goal.com', 80))
socket.gaierror: [Errno -2] Name or service not known

这意味着python无法解析该特定主机,

如果我删除http://并将其保留为goal.com或通过我的浏览器发出该请求,那很好并且脚本和浏览器没有抛出任何错误,stackoverflow的答案之一建议删除我的代理已经完成,但错误并未消失,我尝试过的终端

host http://goal.com

但是它也不能解决,我猜这是我的系统配置中的某件事,但是我无法弄清楚我已经查看了/etc/hosts,但是在那里我看不到任何奇怪的地方。

我知道我可以不用http://就可以了,但是我想知道为什么它不能那样工作,如果我想指定另一个协议,例如httpsftp,该怎么办?

对于ftp,我见过执行ftp.goal.com的代码,例如,对于它们来说似乎工作正常,但我尝试使用http进行操作,但仍然失败。

参考方案

为了回答这个问题,您需要了解TCP/IP stack的工作原理。顺便说一句,我将忽略OSI模型,因为在大多数现实情况下它几乎是无用的。

最重要的是,我们拥有用于在物理/无线链路之间传输位和字节的协议。这包括诸如Ethernet,802.11,MAC之类的东西,等等。这是从一台机器直接连接到另一台机器的直接通信。期。

然后,除此之外,我们有了协议设计的瑰宝之一,即Internet Protocol。与您可能想到的不同,它是一个(相对)非常简单的协议。目的是定义主机,地址,路由,服务质量和其他一些概念。这是非常简约的观点。借助IP,一台机器可以通过网络和网关(通常指路由器)的整体布置间接连接到另一台机器。

但是,知识产权本身有一定的陷阱。即...

没有端口的概念。
一切都必须由Internet地址表示,即没有thingslikethis.com,也称为域。
IP不可靠,这意味着数据包可能会丢失(没有任何通知),重复,损坏等。这确实发生在现代网络中。根本没有“连接”的概念。只是包,期间。

因此,要解决(大多数)这些问题,在协议设计中出现了一个不太聪明的瑰宝Transmission Control Protocol。注意:为简单起见,忽略UDP。 TCP的目的是允许通过不可靠的路由协议(通常为IP)建立可靠且有状态的连接。为此,这给分组增加了相当大的开销,这有时是不希望的。它还具有一些不错的附加功能,例如端口。这个想法是,端口代表在主机内部运行的“服务”或“应用程序”,以及其他应用程序。这是multitasking systems的原始概念。由主机地址和端口组成的一对称为“套接字”。一对套接字,在three-way handshaking上,一个在主机A中指向主机B,另一个在主机B中指向主机A,称为连接。多亏有了TCP,我们现在可以说出诸如192.168.1.123:8080之类的东西,在那里发送数据,并确信数据永远不会到达目的地,或者成功正确地到达目的地。但是,仍然没有域名!

输入Domain Name System。它定义了“域”的层次结构,符号名称表示主机或同一类型的另一层次结构。例如,我们有顶级域com及其子域google,恰好是201.191.202.174。我们以google.com的样式以反序符号表示的域,以点分隔。通过IP加上TCP加上DNS,我们可以知道诸如google.com:21之类的内容,并获得可靠的连接。欢呼!

现在值得注意的是,当Python像大多数库/语言/操作系统一样谈论“套接字”时,它是在TCP的意义上谈论套接字。而且,正如我们已经知道的,TCP只能处理192.168.1.123:8080样式的东西。但是,虽然Python的socket.socket.connect主要是包装器,但它比C / POSIX的connect(3)略带抽象,并且它是通过提供主机名而不是实际地址来与DNS进行适当的跳舞的。尽管如此,抽象到此为止。

但是,诸如https://qwe.rty.uio/asd/fgh.html这样的时髦东西呢?要解决此问题,请输入方程式中最复杂的部分之一。没有人了解,但所有人都赞美了Hypertext Transfer Protocol。 HTTP在某种程度上是一种多功能协议。在此基础上,它定义Uniform Resource Identifiers,大多数情况下是Uniform Resource Locators。这样,您就可以在域后使用斜杠(/)来寻址其中的“资源”,例如图像或网页。 URI还定义了访问资源的方式(http://表示“通过HTTP”,https://表示“通过HTTPS”,ftp://表示“通过FTP”,等等)。 HTTP为World Wide Web(通常错误地称为“ Internet”)添加了无数的额外时髦内容,例如会话,身份验证,加密,状态代码,缓存,代理,文件下载等等

tl; dr:Python的socket库是对C的精简包装,恰巧添加了DNS解析先锋机制。除此之外,它还可以使用原始TCP概念。

python:ConfigParser对象,然后再阅读一次 - python

场景:我有一个配置文件,其中包含要执行的自动化测试的列表。这些测试是长期循环执行的。   配置文件的设计方式使ConfigParser可以读取它。由于有两个三个参数,因此我需要通过每个测试。现在,此配置文件由script(s1)调用,并且按照配置文件中的列表执行测试。Script(s1)第一次读取配置,并且在每次测试完成后都会执行。阅读两次的要求:由于可能会…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python:图像处理可产生皱纹纸效果 - python

也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…