2012-09-20 2 views
2

SocketServer 모듈을 사용하는 서버의 요청 처리기에서 개별 연결에 시간 제한을 추가하고 싶습니다.SocketServer 스레딩 TCP 서버 및 Asyncore 디스패처

처음으로 파이썬을 사용하여 네트워크 프로그래밍을 시도하는 것으로 시작하겠습니다. 나는 하위 클래스 인 SocketServer.BaseRequestHandler와 SocketServer.ThreadingTCPServer & SocketServer.TCPServer를 관리했으며 몇 가지 기본적인 스레드 TCP 기능을 가진 두 개의 클래스를 만들 수 있었다.

그러나 들어오는 연결에 시간 초과가 필요합니다. SocketServer 시간 제한 값과 메서드가 기본 제공되는 서버를 오버라이드 (override)하려고하면 문서가 포킹 서버에서만 작동한다고되어 있으므로 작동하지 않습니다. 나는 X 초 후에 발생하는 타이머 스레드를 만들 수 있었다. 그러나 처리기 스레드 내에서 recv 호출을 차단하는 특성으로 인해,이 스레드는 강제로 종료 될 것이므로 아무 쓸모가 없다. 피하고 싶다.

따라서 특정 데이터 양을 알리고 읽는 asyncore 구현이 필요하다는 것을 알고 있습니다. 5 초 동안 아무런 데이터도 보내지 않으면 해당 연결을 닫으려고합니다. (나는 그 작업을 깨끗하게 수행하는 방법을 알고 있습니다.) 소켓과 함께 asyncore를 사용하는 몇 가지 예를 발견했지만 SocketServer를 사용하지는 않았습니다. 그렇다면 어떻게 asyncore & threadingTCPserver를 구현할 수 있습니까? 가능합니까? 누구든지 완료 했습니까? 이 같은

+1

이런 식으로 할 수 있지만 http://twistedmatrix.com/ - 파이썬 네트워크의 세계에 오신 것을 환영합니다. 프로그램 작성! :) –

+0

Jean-Paul Calderone이 링크를 제공해 주셔서 감사합니다. 나는 전에 그것을 보았다. 그리고 정상적인 상황에서 나는 twistedmatrix를 선택 하겠지만, 이것은 매우 보안 의식이 강하고 오픈 소스 나 타사 라이브러리를 원하지 않는 클라이언트를위한 프로젝트입니다. –

+0

매우 슬프 긴데 논리가 유효하지 않습니다 (파이썬은 오픈 소스와 제 3 자입니다). 프로젝트에 행운을 빌어 요. –

답변

3

당신은 또한 recv 통화 시간 제한을 설정할 수 있습니다 :

sock.settimeout(1.0) 

당신이 SocketServer을 사용하기 때문에, 당신은하여 SocketServer 어딘가에 socket을 기본 발견 할 것이다. SocketServer은 소켓을 생성하므로 직접 처리 할 필요가 없습니다.

SocketServer과 함께 사용하려면 RequestHandler을 정의했을 것입니다.

class RequestHandler(SocketServer.BaseRequestHandler): 
    def setup(self): 
     # the socket is called request in the request handler 
     self.request.settimeout(1.0) 

    def handle(self): 
     while True: 
      try: 
       data = self.request.recv(1024) 
       if not data: 
         break # connection is closed 
       else: 
         pass # do your thing 
      except socket.timeout: 
       pass # handle timeout 
+0

슬프게도이 기능을 사용할 수 없습니다. 나는 요청 처리기 내에서 다음을 시도했다. sock = self.server.socket (socket.AF_INET, socket.SOCK_STREAM) sock = self.request.socket (socket.AF_INET, socket.SOCK_STREAM) 때마다 나는이 일을한다. 연결은 실패한다. –

+1

미안하다. 나는 잠시 후에 분명히 할 것이다. –

+0

정말 고마워요! 이것은 ForkingTCPServer와 함께 작동하고, 정확히 내가 원했던 것을 수행합니다. ThreadingTCPServer로 테스트하고 거기에서도 작동하는지 확인합니다. 다시 한번 감사드립니다 !!! –