我使用声明为服务器创建了一个类:
class myServer(socketserver.BaseRequestHandler):
def handle(self):
pass
并以:
开始someServer = socketserver.UDPServer((HOST, PORT), myServer)
someServer.serve_forever()
我的问题是:如何让服务器自行关闭?我已经看到它有一个基类(基类),名为BaseServer,带有shutdown方法。可以使用someServer
在someServer.shutdown()
上调用它,但这是来自服务器本身的外部。
答案 0 :(得分:1)
你可以使用扭曲。它是关于python的最好的网络库,这里是一个UDP服务器的例子(取自扭曲的文档)有史以来最简单的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 :(得分:1)
使用线程。在超时后由一个线程服务并通过另一个线程。 考虑这个工作示例。为您的UDPServer修改它
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()
答案 2 :(得分:0)
服务器实例在处理程序类中以self.server
的形式提供。因此,您可以使用self.server.shutdown()
方法调用handle
。