如何让Python中的UDPServer自我关闭?
我创建了一个服务器的类,声明如下:
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()