gpt4 book ai didi

python - SocketServer ThreadingTCPServer & Asyncore Dispatcher

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:52 25 4
gpt4 key购买 nike

我想使用 SocketServer 模块为服务器的请求处理程序中的各个连接添加超时。

首先让我说这是我第一次尝试使用 Python 进行网络编程。我已经对 SocketServer.BaseRequestHandler 和 SocketServer.ThreadingTCPServer & SocketServer.TCPServer 进行了子分类,并设法创建了两个具有一些基本线程 TCP 功能的类。

但是我希望我的传入连接超时。试图覆盖任何内置的 SocketServer 超时值和方法是行不通的,因为文档说这只适用于 fork 服务器。我设法创建了一个在 X 秒后触发的计时器线程,但是由于处理程序线程中阻塞 recv 调用的性质,这是没有用的,因为我会被迫杀死它,这是我真正想避免。

所以我的理解是我需要一个 asyncore 实现,在那里我会收到通知并读取一定数量的数据。如果在 5 秒内没有发送任何数据,可以说,我想关闭该连接(我知道如何干净地做到这一点)。我发现了一些将 asyncore 与套接字一起使用的示例,但没有一个使用 SocketServer。那么,我该如何实现 asyncore 和 threadingTCPserver 呢?是否可以?有人做过吗?

最佳答案

您还可以在 recv 调用上设置超时,如下所示:

sock.settimeout(1.0)

由于您使用了 SocketServer,因此您必须在 SocketServer 的某处找到底层的 socket。请注意,SocketServer 会为您创建套接字,因此您无需自己动手。

您可能已经定义了一个 RequestHandler 来配合您的 SocketServer。它应该看起来像这样:

class RequestHandler(SocketServer.BaseRequestHandler):
def setup(self):
# the socket is called request in the request handler
self.request.settimeout(1.0)

def handle(self):
while True:
try:
data = self.request.recv(1024)
if not data:
break # connection is closed
else:
pass # do your thing
except socket.timeout:
pass # handle timeout

关于python - SocketServer ThreadingTCPServer & Asyncore Dispatcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12510522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com