2012-11-17 2 views
1

파이썬 데몬을 작성 중이며 요청을 기다리고 일부 데이터를 반환합니다. 그러나 클라이언트가 스크립트를 요청할 때 데몬은 작업을 중단했습니다. 이 내가 당신이 정말로 서버 기능으로 원하는 특정 아니지만, 당신의 예에 따라 코드데이터를 보낸 후 파이썬 소켓 + 데몬이 중지되었습니다.

...... 
def run(self): 
    while True: 
     server_socket = socket.socket()   # Create a socket object 
     host = socket.gethostname() # Get local machine name 
     port = 12345    # Reserve a port for your service. 
     server_socket .bind((host, port))  # Bind to the port 
       server_socket .listen(5) 

     client_socket, address = server_socket.accept()  
# Establish connection with client. 

     print 'Got connection from', address 
     logging.info(address) 
     #data = client_socket.recv(2048) 
     data = client_socket.recv(1024) 
     logging.info(data) 
...... 

답변

1

입니다, 당신이해야하는 것은 수용하고 한 번에 하나의 클라이언트를 처리 할 수있는 서버입니다. 내가 권하고 싶은 것은 모든 연결마다 매번 서버를 다시 바인딩하지 않는 것입니다. 꼭 필요한 것은 아닙니다. 소켓이 한 번, 다음 고객을 기다리고 루프로 이동

바인드 :

def run(self): 
    server_socket = socket.socket()   
    host = socket.gethostname() 
    port = 12345    
    server_socket.bind((host, port))   
    server_socket.listen(5) 

    while True: 
     # this will block until a client tries to connect 
     client_socket, address = server_socket.accept()  

     print 'Got connection from', address 
     logging.info(address) 
     # this will block until data is received from client 
     data = client_socket.recv(1024) 
     logging.info(data) 

여기에서 일어날 것은 뭔가를 보내 클라이언트를 기다리는 동안 서버가 클라이언트를 허용하고 차단하는 것입니다. 그런 다음 새로운 클라이언트를 기다리는 동안 다시 루프됩니다. 일회용 연결이고 처리가 끝난 소켓을 닫고 싶을 수도 있습니다.

동시에 여러 클라이언트를 처리 할 수있게하려면 기본 스레드에서 루프를 수행 한 다음 통신을 처리하기 위해 작업자 스레드에 새로운 연결을 전달하십시오. 그러면 루핑을 계속하고 새 클라이언트가 연결되기를 기다리는 기본 스레드가 해제됩니다.

각 클라이언트마다 새로운 스레드를 시작하고 소켓을 전달하거나, 실행중인 스레드의 고정 풀간에 Queue을 사용하여이 작업을 수행 할 수 있습니다. 각 스레드는 대기열에서 항목을 가져 오기 위해 대기하고 소켓 항목의 통신 루프로 이동합니다. 작업이 완료되면 대기열에서 대기합니다.

의사 코드는 다음과 같을 수 있습니다

socket_queue = Queue() 
... 
def main_server_thread(): 
    while True: 
     # this will block until a client tries to connect 
     client_socket, address = server_socket.accept()  

     print 'Got connection from', address 
     logging.info(address) 

     # this will finish right away and loop again 
     socket_queue.put(client_socket) 
... 
def client_worker_thread(): 
    while True: 
     sock = socket_queue.get() 
     while sock is still connected: 
      data = sock.recv(1024) 
      logging.info(data)     
관련 문제