python - SocketServer ThreadingTCPServer & Asyncore Dispatcher

标签 python sockets asyncsocket socketserver asyncore

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

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

但是我希望我的传入连接超时。尝试覆盖任何内置的 SocketServer 超时值和方法都不起作用,因为文档称这只适用于 fork 服务器。我已经成功创建了一个在 X 秒后触发的计时器线程,但是由于 Handler 线程内阻塞 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/

相关文章:

python - 在 tensorflow 中展开张量

python - 文件中的模式匹配

java - 连接到模拟器服务器的多个模拟器客户端

c - 框成一个大的一维数组

c# - 异步套接字的内存问题并开始发送

python - 为什么在 Python 中创建列表需要更多时间?

python - python中的Matlab numerictype/reinterpretcast等价物?

javascript - 如何从路由/索引访问 io.emit()? express 4.15

c++ - 收到的套接字客户端-服务器字符串是中文字符

c# - 搭建C#异步TCP代理服务器