在python中,如何让UDPServer自行关闭?
我已使用以下声明为服务器创建了一个类:在python中,如何让UDPServer自行关闭?,python,udp,shutdown,socketserver,Python,Udp,Shutdown,Socketserver,我已使用以下声明为服务器创建了一个类: class myServer(socketserver.BaseRequestHandler): def handle(self): pass 首先是: someServer = socketserver.UDPServer((HOST, PORT), myServer) someServer.serve_forever() 我的问题是:如何让服务器自行关闭?我看到它有一个基类(属于基类),名为BaseServer,
class myServer(socketserver.BaseRequestHandler):
def handle(self):
pass
首先是:
someServer = socketserver.UDPServer((HOST, PORT), myServer)
someServer.serve_forever()
我的问题是:如何让服务器自行关闭?我看到它有一个基类(属于基类),名为BaseServer,带有一个shutdown方法。可以使用
someServer.shutdown()
在someServer上调用它,但这是从服务器本身的外部调用的。可以使用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()关闭此功能。使用线程。由一个线程提供服务,并在超时后通过另一个线程。
考虑这个工作例子。为您的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()
服务器实例在处理程序类中作为self.server
提供。因此,您可以在handle
方法中调用self.server.shutdown()。。。我应该声明我不允许使用非标准库。谢谢。为什么除了stdlib,你什么都不能用?socket是许多人都会陷入的一个令人讨厌的陷阱。因为它是用于DNS上的计算机网络课程的作业,即使socket编程不是作业的重点,他们仍然选择不允许使用标准库以外的任何东西。具体地说,dnslib还包括其他外部库。不管怎样,截止日期已经过去了。我希望我所做的是足够的。在整个课程中,这个作业有很多问题,所以最终我重新提交了这个,这次我实现了你的想法。成功了。我对它进行了一些调整,使用了一个带有acquire
和release
的锁,这样服务器可以在锁完成后释放锁,然后负责关闭它的线程获取锁并关闭服务器。我想我是想写一个不同的答案。Jakob-为什么不呢?这确实符合他的目的。似乎是正确的,但在我剩下的很短时间内,我无法让它发挥作用。我应该早点问这个问题,而不是用头撞墙去尝试不同的事情。@Jakob,线程解决方案有效。我还没有找到另一个。你有一个工作的非线程的例子吗?听起来不错。太糟糕了,我的截止日期已经过去了,但我还是尝试了,使用了print(“before”)
、self.server.shutdown()
和print(“before”)
,但由于某种原因,它没有通过shutdown
命令。这对我也不起作用。程序在windows上死锁(无法控制+C out,必须控制+Break out)。似乎无法从RequestHandler中调用server.shutdown()。我猜关机会等待所有请求完成。请求处理程序中的这段代码等待服务器关闭。即时死锁。使用线程延迟一点,然后调用“server.shutdown()”就可以了。混乱,但可能是必要的。shutdown()
方法的Docstring表示停止永远服务循环。阻塞,直到循环完成。必须在另一个线程中运行SERVICE_forever()时调用此函数,否则它将死锁。请参见SocketServer.py文件中的。