2011-03-03 2 views
4

나는 선언과 서버의 클래스를 만들었습니다파이썬에서 UDPServer를 종료하는 방법은 무엇입니까?

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

그리고 그것은 시작 :

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

내 질문은 : 어떻게 종료 자체 서버를 얻을 수 있나요? 나는 그것이 shutdown 메소드를 가진 BaseServer라는 기본 클래스를 가지고 있음을 보았다. someServer에서 someServer.shutdown()으로 호출 할 수 있지만 이는 서버 외부에서 발생합니다.

답변

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() 
+0

스레드 응답을 제안하지 마십시오. -1 –

+0

야콥 - 왜 안 되니? 그것은 그의 목적에 부합합니다. –

+0

옳은 것 같지만 내가 떠난 짧은 시간 동안 일할 수 없었습니다. 다른 일을 시도하면서 벽에 머리를 두드리는 대신 빨리 질문해야했습니다. – shwartz

1

트위스트를 사용할 수 있습니다. 그것 파이썬에 대한 최고의 네트워킹 lib에 대한, 여기에 여기에 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

흠 ... 내가 비표준 라이브러리를 사용할 수 없다고 진술 했어야합니다. 감사. – shwartz

+0

왜 stdlib를 사용할 수 있습니까? 소켓은 많은 사람들이 빠져들고있는 불쾌한 함정입니다. –

+0

DNS의 컴퓨터 네트워킹 과정에서 할당하기 때문에 소켓 프로그래밍이 할당의 주요 포인트가 아니지만 그들은 여전히 ​​표준 라이브러리 이외의 것을 사용하지 못하도록 선택했습니다. 특히, dnslib뿐만 아니라 다른 외부 라이브러리. 어쨌든, 마감은 지났어. 내가 한 일이 충분했기를 바란다. – shwartz

0

서버 인스턴스는 처리기 클래스에서 self.server으로 사용할 수 있습니다. 따라서 handle 방법에서 self.server.shutdown()으로 전화 할 수 있습니다.

+0

좋은 소리입니다. 내 마감 시간이 지났음에도 불구하고 여전히'print ("앞에") ","self.server.shutdown() "및"print ("after") '로 시도했지만, 어떤 이유로 'shutdown' 명령을 전달하십시오. – shwartz

+0

이것은 나에게도 도움이되지 못했습니다. Windows에서 프로그램이 교착 상태에 빠져 있습니다 (Control + C Out을 제어 할 수없고 Ctrl + Break를 눌러야 함). server.shutdown()을 RequestHandler 내에서 호출 할 수없는 것 같습니다. 내 생각 엔 시스템 종료가 모든 요청을 기다리는 것입니다. 요청 처리기의 해당 비트 코드는 서버가 종료 될 때까지 대기합니다. 즉시 교착 상태. 스레드를 사용하여 비트를 지연시킨 다음 "server.shutdown()"을 호출합니다. 지저분하지만, 아마도 필요한 것일까 요? – rocketmonkeys

+3

'shutdown()'메소드의 Docstring은 serve_forever 루프를 멈춘다 고 말합니다. 루프가 끝날 때까지 차단합니다. serve_forever()가 다른 스레드에서 실행 중일 때 호출되어야합니다. 그렇지 않으면 교착 상태가됩니다._ SocketServer.py 파일의 [source] (http://hg.python.org/cpython/file/2.7/Lib/SocketServer.py#l243)를 참조하십시오. –

관련 문제