Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,如何让UDPServer自行关闭?_Python_Udp_Shutdown_Socketserver - Fatal编程技术网

在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文件中的。