Python 套接字 Accept 超时
套接字是网络通信的基本构建块。 每当两个网络实体需要传输数据时,就会打开一个套接字。
这些套接字在会话期间保持连接。 但有时,在 Python 中使用套接字时,您可能会等待很长时间,而另一端仍然接受套接字连接。
本文讨论了 Python 中套接字的超时功能,该功能对于缓解无限期等待套接字接受的问题是必要的。
套接字接受、拒绝和超时
每当您尝试使用 Python 脚本建立与服务器的连接时,您都需要打开一个套接字连接。 此套接字连接充当在客户端和服务器之间传输数据的隧道。
在打开socket的过程中,有三种场景。
- Socket Accept:当socket打开成功,此时服务端和客户端已经建立连接,可以收发数据,我们称之为socket accept。 这个场景就是打开一个socket的最终目的。
- Socket reject:假设您打开了一个套接字但传递了一些不同的参数,忘记传递参数或没有正确遵循打开套接字的过程; 你会得到拒绝。 这意味着无法建立发送和接收数据的连接。
-
Socket Accept 超时:这是一个重要但被忽视的场景。 有时当您尝试打开一个套接字时,您可能不会从另一端得到任何响应。
因此,您将永远等待。 这是一种不受欢迎的情况,因为您想关闭当前请求并尝试另一个请求,而不是永远等待。
超时选项允许您设置最长等待时间以使您的请求被另一方接受。 超过时间限制后,将引发错误。
套接字方法及其在 Python 中的使用
Python 有一个名为 socket 的内置库,您需要导入它才能使用套接字连接。 让我们看看套接字库的一些重要方法。
- accept():顾名思义,accept() 方法接受来自另一方的传入套接字请求。 此方法返回一个套接字连接,您可以使用它在连接的实体之间传输数据。
-
bind():此方法将套接字连接绑定或附加到地址。 如果您想使用套接字,则必须调用此方法。
bind() 方法接受一个 IP 地址元组和它绑定套接字的端口。
- listen():这是一个服务器端方法,它使服务器能够接受套接字以在连接之间传输数据。
- connect():此方法接受一个地址作为参数。 然后它在该地址连接远程套接字。
- settimeout():此方法接受一个非零数字作为引发 TimeoutError 之前等待的秒数。 此方法对于缓解无限等待时间的问题很重要。
- setdefaulttimeout():如果您使用多个套接字连接并希望为每个连接设置相同的超时限制,那么这是您的首选方法。 它接受秒数作为参数,并将其作为等待超时限制应用于所有新的套接字连接。
Python 中的套接字接受超时示例
让我们在 Python 代码的帮助下看一个套接字接受超时的例子。 对于此示例,我们需要编写两个 Python 脚本,一个用于服务器,另一个用于客户端。
我们将看到三种不同的场景,如下所述。
-
第一种情况是没有设置超时限制。 在这种情况下,客户将继续等待。
请注意,根据您的操作系统,请求可能会在一段时间后自动拒绝。
-
第二种情况是我们使用
settimeout()
方法设置超时限制。 在这种情况下,您将在设置的限制后得到 TimeoutError。 -
在第三种情况下,我们将使用
setdefaulttimeout()
方法来设置超时限制。
下面我们一一看看上面三种情况的代码。
未设置超时限制时 Python 中的套接字接受超时
服务器端脚本:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(('', 1717))
客户端脚本
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('127.0.0.1', 1717))
您在服务器端看不到 listen()
方法。 因此,服务器没有响应,客户端正在等待。
设置超时时Python中的套接字接受超时
在这种情况下,您会看到客户端在超过超时时间后中止操作并引发 TimeoutError。
服务器端:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(('', 1717))
客户端脚本
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(3) s.connect(('127.0.0.1', 1717))
在这种情况下,会引发 Python 套接字 TimeoutError。 请注意,套接字的行为可能因平台而异。
在 Linux 机器上,套接字抛出 ConnectionRefusedError: [Errno 111] Connection refused 错误,直到您不接受服务器端的套接字。
在 Python 中为每个套接字设置默认超时
此方法将为所有新套接字设置相同的默认超时。 这样,您可以通过为每个套接字单独设置超时来节省时间和麻烦。
服务器端:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(('', 1717))
客户端:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: socket.setdefaulttimeout(3) s.connect(('127.0.0.1', 1717))
请注意
,对于setdefaulttimeout()
,您必须直接使用套接字类而不是对象,因为它为所有线程设置超时。
总结
套接字超时是 Python 套接字编程的一个重要方面。 如果您不处理超时,您可能会让您的客户端永远等待套接字。
或者在其他情况下,根据您的环境实现,它可能会引发错误。
相关文章
在 Python 中使用 OpenCV 的 imshow() 函数
发布时间:2023/06/01 浏览次数:80 分类:Python
-
本篇文章将介绍如何使用该库的 imshow() 函数。在 Python 中使用 OpenCV 库中的 imshow() 函数 cv2.imshow() 函数可以在新窗口中显示图像。 创建的窗口将自动调整以适合图像。
Python 中的 OpenCV-contrib 模块
发布时间:2023/06/01 浏览次数:192 分类:Python
-
Python 提供了一个名为 OpenCV 的标准库。 它有很多工具和功能来处理和实现不同的技术和算法。这个 OpenCV 库中有一个名为 OpenCV-contrib 的附加项。 我们将在本教程中讨论这个 OpenCV-contrib 模块及其
Python 中 OpenCV 阈值
发布时间:2023/06/01 浏览次数:199 分类:Python
-
本篇文章将解决在 Python 中使用 cv2.threshold() 函数的问题。阈值技术 阈值处理是一种对黑白图像进行的图像处理技术,可用于去除噪声和过滤具有极值的像素。
Python 中的 OpenCV Canny
发布时间:2023/06/01 浏览次数:184 分类:Python
-
本篇文章将介绍 Python 中的 cv2.canny() 函数。在 Python 中使用 cv2.canny() 函数 cv2.canny() 函数实现了由 John F. Canny 开发的 Canny 边缘检测算法。
在 Python 中使用 OpenCV 筛选
发布时间:2023/06/01 浏览次数:54 分类:Python
-
本教程将演示如何使用 OpenCV 实现 SIFT 算法并将其用于 Python 中的特征匹配。 我们还将学习在 Python 中使用 OpenCV 使用 SIFT 算法来匹配两个图像。
OpenCV ArUco 标记
发布时间:2023/06/01 浏览次数:110 分类:Python
-
本篇文章将介绍使用 OpenCV 的 cv2.aruco.detectMarkers() 函数检测 ArUco 标记。使用 OpenCV 检测 ArUco 标记
OpenCV 包配置
发布时间:2023/06/01 浏览次数:159 分类:Python
-
OpenCV 是一个机器学习库,提供与计算机视觉应用程序相关的各种功能。 OpenCV 可以与 C++、Python、Java 和 MATLAB 一起使用。下面我们将列出安装和运行 OpenCV 时的一些常见问题以及如何解决这些问
使用 OpenCV 在图像上使用 Bitwise_AND
发布时间:2023/06/01 浏览次数:199 分类:Python
-
按位运算符通常用于对使用单个位操作的位或二进制数的模式执行按位运算。 OpenCV 使用相同的概念来处理和提取图像中的信息。在本文中,我们将具体了解如何使用 Python OpenCV 库来使用 Bitwi
OpenCV 中的图像遮罩
发布时间:2023/06/01 浏览次数:55 分类:Python
-
如果我们想过滤掉图像的某些部分,然后将这个过滤掉的部分与另一幅图像结合起来,那么这可以使用遮罩来完成。 在 OpenCV 中,按位与运算符用于将两个不同的图像合并为一个,或者它可以将