如何让Python中的UDPServer自我关闭?

4 投票
3 回答
2588 浏览
提问于 2025-04-16 12:54

我创建了一个服务器的类,声明如下:

class myServer(socketserver.BaseRequestHandler):  
    def handle(self):  
        pass

然后我用下面的代码启动了它:

someServer = socketserver.UDPServer((HOST, PORT), myServer)  
someServer.serve_forever()

我想问的是:我怎么让服务器自己关闭呢?我发现它有一个基类(基类的基类)叫做BaseServer,里面有一个shutdown方法。这个方法可以通过 someServer 来调用,像这样 someServer.shutdown(),但这是在服务器外部调用的。

3 个回答

0

在处理程序类中,可以通过 self.server 来访问服务器实例。所以你可以在 handle 方法里调用 self.server.shutdown() 来关闭服务器。

1

你可以使用 twisted。它是 Python 中最好的网络库之一。这里有一个例子,展示了一个 UDP 服务器,这是从 twisted 的文档中提取的,算是最简单的 UDP 服务器了;

#!/usr/bin/env python

# Copyright (c) 2001-2009 Twisted Matrix Laboratories.
# See LICENSE for details.

from twisted.internet.protocol import DatagramProtocol
from twisted.internet import reactor

# Here's a UDP version of the simplest possible protocol
class EchoUDP(DatagramProtocol):
    def datagramReceived(self, datagram, address):
        self.transport.write(datagram, address)

def main():
    reactor.listenUDP(8000, EchoUDP())
    reactor.run()

if __name__ == '__main__':
    main()

当你准备好或者发生某个特定事件时,可以通过调用 self.transport.loseConnection() 来关闭这个服务器。

1

通过使用线程来实现。一个线程负责服务,另一个线程在超时后进行处理。可以参考这个有效的例子。你可以根据自己的UDP服务器进行修改。

import threading
import time
import SimpleHTTPServer
import SocketServer

PORT = 8000
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)

def worker():

    # minimal web server.  serves files relative to the
    print "serving at port", PORT
    httpd.serve_forever()

def my_service():
    time.sleep(3)
    print "I am going down"
    httpd.shutdown()

h = threading.Thread(name='httpd', target=worker)
t = threading.Thread(name='timer', target=my_service)

h.start()
t.start()

撰写回答