4

我用声明为服务器创建了一个类:

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

并开始:

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

我的问题是:如何让服务器自行关闭?我已经看到它有一个名为 BaseServer 的基类(一个基类),带有一个关闭方法。可以调用它someServersomeServer.shutdown()但这来自服务器本身的外部。

4

3 回答 3

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()然后,您可以通过调用When you are ready 或特定事件发生来关闭它。

于 2011-03-03T09:19:16.360 回答
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()
于 2011-03-03T09:19:32.297 回答
0

服务器实例self.server在处理程序类中可用。所以你可以调用self.server.shutdown()handle方法。

于 2011-03-03T15:23:37.403 回答