2012-11-17 57 views
1

我正在编写python守护进程,它等待请求并返回一些数据。但是,当客户端请求脚本时,守护进程停止工作。 这是代码发送数据后Python socket +守护进程停止

...... 
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)