2012-05-07 6 views

답변

7

소스 코드를보고 나서 빨리 해결할 수있었습니다. 소스에 직접 연결하는 문서 덕분에!

루프를 종료하는 앱에서 간단히 올릴 수있는 예외가 있습니다 (ExitNow).

docs의 EchoHandler 예제를 사용하여 데이터 수신시 즉시 종료되도록 수정했습니다.

class EchoHandler(asyncore.dispatcher_with_send): 

    def handle_read(self): 
     data = self.recv(8192) 
     if data: 
      raise asyncore.ExitNow('Server is quitting!') 

또한, 당신이 내부적으로 사용하는 경우는 ExitNow 그래서 앱을 발생시키지 않습니다 잡을 수있는 점에 유의하십시오. 이것은 나의 근원 중 일부입니다 :

5

연결이 남아 있지 않을 때도 asyncore 루프가 종료되어 연결을 닫을 수 있습니다. 여러 연결이 계속되면 asyncore.close_all()을 사용할 수 있습니다.

4

또 다른 방법은 asyncore.loop 호출의 count 매개 변수를 사용하는 것입니다. 그런 다음 다른 논리에 asyncore.loop 포장 할 수 있습니다

while(i_should_continue()): 
    asyncore.loop(count=1) 

이 바로 열려있는 연결, 또는 조기 타임 아웃을 멈추지 않을 것입니다. 그러나 이것은 아마도 좋은 것일까요? 나는 청취 서버를 시작할 때 이것을 사용하고있다.

+1

죽는다. 위의 다른 솔루션은 루프 내에서 루프를 중지하기위한 것입니다. –

5

이 시도 :

서버에 대한

한 클래스 (asyncore.dispatcher를 확장) :

class Server(asyncore.dispatcher): 

    def __init__(self, port): 
     asyncore.dispatcher.__init__(self) 

     self.host = socket.gethostname() 
     self.port = port 

     self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.set_reuse_addr() 
     self.bind((self.host, self.port)) 
     self.listen(5) 
     print "[Server] Listening on {h}:{p}".format(h=self.host, p=self.port) 

    def handle_accept(self): 
     pair = self.accept() 
     if pair is not None: 
      sock, addr = pair 
      print "[ServerSocket] We got a connection from {a}".format(a=addr) 
      SocketHandler(sock) 

서버를 관리하는 것입니다 스레드에 대한 또 다른 클래스를 ... 체크 (스레드를 확장)

:

이제
class ServerThread(threading.Thread): 
    def __init__(self, port): 
     threading.Thread.__init__(self) 
     self.server = Server(port) 

    def run(self): 
     asyncore.loop() 

    def stop(self): 
     self.server.close() 
     self.join() 

서버를 시작하기 : 우리가 부르는 곳 run() 메소드는, asyncore.loop()가 0

# This is the communication server, it is going to listen for incoming connections, it has its own thread: 
s = ServerThread(PORT) 
s.start()    # Here we start the thread for the server 
print "Server is ready..." 
print "Is ServerThread alive? {t}".format(t=str(s.is_alive())) 
raw_input("Press any key to stop de server now...") 
print "Trying to stop ServerThread..." 
s.stop() 
print "The server will die in 30 seconds..." 

당신은 서버가 즉시 죽지 않습니다 것입니다 ...하지만 당신이 "루프의 외부"에서 루프를 중지 할 경우는 아마도 적절한 솔루션을 정상적으로

관련 문제