В python, как заставить UDPServer отключить себя? - PullRequest
4 голосов
/ 03 марта 2011

Я создал класс для сервера с объявлением:

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

И начал его с:

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

Мой вопрос: как я могу заставить серверсамо отключение?Я видел, что у него есть базовый класс (базового класса) под названием BaseServer с методом завершения работы.Он может быть вызван на someServer с someServer.shutdown(), но это извне самого сервера.

Ответы [ 3 ]

1 голос
/ 03 марта 2011

Используя темы. Обслуживание по одному потоку и переход по другому после вашего тайм-аута. Рассмотрим этот рабочий пример. Измените его для вашего 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()
1 голос
/ 03 марта 2011

Вы можете использовать витую.Это лучшая сетевая библиотека для 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() Когда вы будете готовы или произойдет определенное событие.

0 голосов
/ 03 марта 2011

Экземпляр сервера доступен как self.server в классе обработчика.Таким образом, вы можете вызвать self.server.shutdown() в методе handle.

...